2010-11-26 51 views
0

我有一個關於編程和文件的問題。C編程 - 文件 - fwrite

while(current!=NULL) 
{ 
    if(current->Id_Doctor!='\0') 
    { 
    current=current->next; 
    id_doc=(current->Id_Doctor); 
    } 
    if(current->Id_Doctor=='\0') 
    { 
    id_doc=id_doc+1; 
    printf("%d", id_doc); 
    break; 
    } 
} 
fwrite(&id_doc, sizeof(char), 1, Archivo); 

我不知道爲什麼,但它不是在所謂的「檔案館」的二進制文件寫入id_doc的價值... ...可能是什麼問題呢? 我加id_doc的printf和值是printed..I真的不知道

好吧,繼承人的完整代碼(更少):

struct Medico 
{ 
    int Id_Doctor; 
    int Estado; 
    char Nombre[60]; 
    char Clave_Acceso[20]; 
    char Especialidad[40]; 
    struct Medico *next; 
}; 
void Dar_Alta_Med (int estado); 
void MenuPrincipal(char enta); 
int main(void) 
{ 
    char enta; 
    MenuPrincipal(enta); 
} 
void Dar_Alta_Med(int estado) 
{ 
    struct Medico * head = NULL; 
    struct Medico * prev, *current; 
    char nombre_doc[60], especialida[40], password[20]; 
    int id_doc=0, estado_doc=1; 
    FILE *Archivo; 
const char *md1="\n<md>\n"; 
    const char *id_doc1="<id_doctor> "; 
Archivo=fopen("md.dat", "ab+"); 
    fwrite(md1, 1, strlen(md1), Archivo); 
    fwrite(id_doc1, 1, strlen(id_doc1), Archivo); 
    current = (struct Medico *) malloc (sizeof(struct Medico)); 
    current->Id_Doctor=id_doc; 
    while(current!=NULL) 
    { 
     if(current->Id_Doctor!='\0') 
    { 
     current=current->next; 
     id_doc=(current->Id_Doctor); 
    } 
     else 
    { 
     id_doc=id_doc+1; 
     printf("%d", id_doc); 
     break; 
    } 
    } 
    fwrite(&id_doc, sizeof(id_doc), 1, Archivo); 
    printf("Ingresa el nombre del Doctor a dar de alta: "); 
    fclose(Archivo); 
} 

我在這裏死了,請幫助:/

+1

哪裏是'id_doc`的聲明? – 2010-11-26 05:54:06

+0

這似乎是一個笨拙的方式來查找鏈接列表中的最大id_doctor值...? – 2010-11-26 06:08:36

+0

作爲`Archivo`在aka中打開的模式是正確打開**二進制**寫入? – Necrolis 2010-11-26 06:19:14

回答

2

嘗試添加fflush(Archivo);來強制寫入所有緩衝的數據。

而且,這樣的說法:if(current->Id_Doctor=='\0')真的應該是一個else,因爲沒有任何其他東西也可以是,但'\0'

0

如果你的第一currentId_Doctor你有一個無限循環。

如果在您的上一次current之後沒有current而非Id_Doctor,則會得到一個非法指針derefenciation。

對於您的問題: 嘗試flush()系列。

2

三件事:

  • 確保您的fopen是成功的。

    Archivo=fopen("md.dat", "ab+"); 
    if (Archivo == NULL) 
    { 
        perror("Failed to open file Archivo"); 
        ... 
    } 
    
  • 確保你檢查你的fwrite的成功。

    if (fwrite(&id_doc, sizeof(id_doc), 1, Archivo) < 1)  
    {  
        perror("Failed to write to file Archivo"); 
        ... 
    } 
    
  • 確保你有一個fclose正確關閉文件。

    if (fclose(Archivo) != 0)  
    {  
        perror("Failed to close file Archivo");  
        ... 
    } 
    

現在你已經發布您的代碼的完整樣本,我想我應該問,如果錯誤檢查剛走出去簡潔?如果沒有,你應該考慮添加它。

如果您希望輸出文件中id_doc的值爲顯示格式,則必須將int轉換爲字符串(使用snprintf或類似的方式),然後將該字符串寫入輸出文件。

1
fwrite(&id_doc, sizeof(char), 1, Archivo); 

如果您將id_doc定義爲char以外的任何其他字符,它會將\ 0寫入該文件。

更清潔的將是:

fwrite(&id_doc, sizeof(id_doc), 1, Archivo); 
0

你傳遞一個指向一個四字節INT,但只寫一個字節(在錯誤字節)!

解決方案:將id_doc聲明爲「char」,而不是「int」。

0

您以前寫的字符串"\n<md>\n""<id_doctor> "到文件Archivo,這似乎表明,它是不是二進制文件在所有的,而是一個XML樣式的文件。

在這種情況下,你幾乎可以肯定要的是:

fprintf(Archivo, "%d", id_doc);