2010-11-26 14 views
0

Ich habe eine Frage bezüglich Programmierung und Dateien.C Programmierung - Datei - 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); 

Ich weiß nicht, warum, aber es aint den Wert id_doc auf der Binärdatei zu schreiben ‚Archivo‘ genannt ..., was das Problem sein könnte? Ich habe eine printf von id_doc und der Wert wurde printed..I weiß wirklich nicht,

Ok, here der vollständige Code (mehr-weniger):

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); 
} 

Im hier zu sterben, bitte helfen:/

+1

Wo ist die Erklärung von 'id_doc'? –

+0

Dies scheint eine ungeschickte Möglichkeit zu sein, den maximalen Wert von id_doctor aus einer verknüpften Liste zu finden ...? –

+0

Welcher Modus als 'Archivo' geöffnet in aka war es richtig für ** binäre ** Schrift geöffnet? – Necrolis

Antwort

2

Versuchen Sie, fflush(Archivo); hinzuzufügen, um ein Schreiben aller gepufferten Daten zu erzwingen.

Auch diese Aussage: if(current->Id_Doctor=='\0') sollte wirklich ein else sein, da keine andere Sache ist es es aber '\0'

+0

das Ding ist als in Archivo haben wir Daten geschrieben, die wir nicht löschen können. Zum Beispiel haben wir: ** die "**" bedeutet der Ort, wo wir die ID_doc setzen möchten – Jujitsu

+0

Wir haben das auch versucht und hat auch nicht funktioniert; und ja, wir haben es anders geändert, idk, was war das mit haha ​​ – Jujitsu

+0

Ein fflush wäre unnötig, da der fclose-Aufruf erreicht und erfolgreich ist (und keine foreads auf Archivo zwischen frwites durchgeführt werden). –

0

Wenn Ihr erster current ist ein Id_Doctor eine Endlosschleife haben sein.

Wenn es keine current nach Ihrer letzten current ist, die keine Id_Doctor ist, erhalten Sie eine illegale Zeiger Derefenciation. Für Ihr Problem versuchen Sie die flush() Familie.

+0

das ist unser Programm: – Jujitsu

2

Drei Dinge:

  • Stellen Sie sicher, dass fopen erfolgreich ist.

    Archivo=fopen("md.dat", "ab+"); 
    if (Archivo == NULL) 
    { 
        perror("Failed to open file Archivo"); 
        ... 
    } 
    
  • Stellen Sie sicher, dass Sie den Erfolg Ihrer fwrite überprüfen.

    if (fwrite(&id_doc, sizeof(id_doc), 1, Archivo) < 1)  
    {  
        perror("Failed to write to file Archivo"); 
        ... 
    } 
    
  • Vergewissern Sie sich, dass Sie die Datei ordnungsgemäß schließen können.

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

Jetzt, wo Sie Post eine vollständige Probe des Codes habe ich denke, ich fragen sollte, ob die Fehlerprüfung der Kürze halber nur gelassen wird? Wenn nicht, sollten Sie darüber nachdenken, es hinzuzufügen.

Wenn Sie erwarten, dass der Wert von id_doc im Anzeigeformat in der Ausgabedatei ist, müssen Sie das int in eine Zeichenkette konvertieren (mit snprintf o.ä.) und die Zeichenkette stattdessen in die Ausgabedatei schreiben.

1

Wenn Sie id_doc als etwas anderes als ein Zeichen definiert haben, schreibt es \ 0 in die Datei.

Viel sauberer wäre:

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

Das haben wir gerade ausprobiert und haben nicht funktioniert; :( – Jujitsu

0

Sie einen Zeiger auf ein Vier-Byte-INT vorbei, aber nur ein Byte (das falsch Byte) zu schreiben!

Lösung: deklarieren Sie id_doc als "char", nicht "int".

0

Sie haben zuvor die Saiten geschrieben "\n<md>\n" und "<id_doctor> " in die Datei Archivo, die, dass es überhaupt nicht eine Binärdatei ist, um anzuzeigen scheint, sondern eine XML-Stil-Datei.

In diesem Fall, was Sie mit ziemlicher Sicherheit wollen, ist:

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