2017-02-12 4 views
0

Schreiben ein Programm, das Daten aus einer Textdatei liest und gibt sie in eine binäre Datei. Ich bin mir ziemlich sicher, dass ich die Datei richtig lese, weil, wenn ich die Informationen drucke, es richtig herauskommt. Das Schreiben in die Binärdatei ist jedoch falsch. Jede Zeile der Textdatei lautet:Schreiben in Binär-Datei

Vorname Nachname id gpa

Wo die Vor- und Nachnamen sind Strings von maximal 255 Zeichen, die ID ist ein unsigned 4-Byte-Ganzzahl, und die gpa ist eine 4-Byte-Gleitkommazahl. Ich habe es aus der Datei lesen und die richtigen Informationen drucken, aber es ist etwas falsch mit der Ausgabedatei. Es kommt fast 1,5 KB für eine Textdatei, die nur 61 Byte war. Was ist falsch an meinem Code?

#include <stdio.h> 
#include <stdlib.h> 

int textToBinary() 
{ 
    FILE * textfile = fopen("t2.txt", "r"); //Open and read text file 
    FILE * binfile = fopen("t2tobin.bin", "wb"); //Open writable bin file 

    unsigned char firstName[256]; 
    unsigned char lastName[256]; 
    unsigned int id; 
    float gpa; 
    char nLine[]= "\n"; 
    char space[]= " "; 

    if(NULL == textfile) //alerts and exits if binfile is not found 
    { 
     fprintf(stderr, "Failed to open file\n"); 
     fflush(stderr); 
     exit(1); 
    } 


    //implement a loop to continue until the end of the file 
    while(fscanf(textfile, "%s %s %d %f", firstName, lastName, &id, &gpa)!= EOF){ 
     //read one line of the text file 
     printf("%s %s %d %.1f\n", firstName, lastName, id, gpa); //print line information ((test)) 
     //Writing information to binary file 
     fwrite(firstName, sizeof(firstName), 1, binfile);//first name 
     fwrite(space, sizeof(space), 1, binfile);//space 
     fwrite(lastName, sizeof(lastName), 1, binfile);//last name 
     fwrite(space, sizeof(space), 1, binfile);//space 
     fwrite(&id, sizeof(unsigned int), 1, binfile);//ID 
     fwrite(space, sizeof(space), 1, binfile);//space 
     fwrite(&gpa, 4, 1, binfile);//gpa 

     fwrite(nLine, sizeof(nLine), 1, binfile);//new line 
    } 

    fclose(binfile); 
    fclose(textfile); 
    return 0; 
} 
+0

es erwartet wird, da jeder Schreib einer Zeichenfolge 256 Byte verwendet. Schreibe 6 davon, du bekommst 1,5Kb! beiseite: 'fwrite (& gpa, 4, 1, binfile)' => 'fwrite (& gpa, sizeof (float), 1, binfile)' –

+0

1. Warum sind die Überprüfung Sie nicht die Rückgabewerte von 'fopen' - also die binabry ein. 2. Formatieren Sie den Code, um ihn lesbar zu machen. –

+1

Verwenden Sie 'strlen' anstelle von' sizeof', wenn Sie mit 'fwrite' in die Datei schreiben. – redxef

Antwort

0

Die Sache ist, dass jedes Mal, wenn Sie eine Zeichenfolge in Ausgabedatei schreiben Sie schreiben genau 256 Bytes, weil sizeof(firstName) 256 entspricht (siehe Ihre Erklärung, 1 Byte pro Zeichen * 256).

Korrekte Lösung ist strlen Funktion (Länge der Zeichenfolge) anstelle von sizeof, wenn Sie Strings schreiben. Aber Zeichenketten in C müssen mit \0 Zeichen enden. Wenn Sie Strings lesen, wird Ihr Array von Zeichen (firstName, lastName) standardmäßig am Ende mit Zeichenfolgen und \0 Zeichen gefüllt. Sie müssen also nur auf Ausgabezeichenfolge mit diesem ein Byte am Ende, das ist, warum die tatsächliche Menge an Bytes, die Sie für einen String schreiben ist sizeof(string)+1:

... 
fwrite(firstName, strlen(firstName)+1, 1, binfile);//first name 
fwrite(space, sizeof(space), 1, binfile);//space 
fwrite(lastName, strlen(lastName)+1, 1, binfile);//last name 
fwrite(space, sizeof(space), 1, binfile);//space 
fwrite(&id, sizeof(unsigned int), 1, binfile);//ID 
fwrite(space, sizeof(space), 1, binfile);//space 
fwrite(&gpa, 4, 1, binfile);//gpa 
... 
+0

Könnten Sie auch die Rücklesefunktion bereitstellen? –

Verwandte Themen