2017-11-22 3 views
0

Ich habe eine Binärdatei mit einigen Zeilen hinein (ich weiß nicht, wie viel genau) und ich möchte diese Zeilen in der Struktur bis zum Ende der Datei lesen und dann neu schreiben Diese Zeilen in neue file.txt. Meine Frage ist: Wie kann ich von Binärdatei in Struktur bis zum Ende der Datei lesen? Es druckt nur die ersten 11 Zeilen. Muss ich Speicher für diese oder etw. Zuweisen?lesen binäre Datei in c bis zum Ende der Datei

struct linien 
    { 
     short x1, x2, y1, y2; 
     unsigned char R, G, B; 
    }; 


    FILE *fp; // pointer to a file type 
    FILE *fpa; // pointer to a file type 

    int counter; 
    struct linien x; //x is a variable of type struct linien 

    //open files - one for reading and another one for writing 
    fp = fopen("\\Linien.pra", "rb"); 
    fpa = fopen("\\Linien.txt", "w"); 

    //check to see if files opened succesfully 
    if ((fp == NULL)||(fpa == NULL)) 
    { 
     printf("file failed to open\n"); 
    } 

die for-Schleife scheint nicht korrekt zu funktionieren.

else 
    { 
     for (counter = 0; counter < sizeof(x); counter++) //print and write lines 
     { 
      //read the file Linien.pra 
      fread(&x, sizeof(x), 1, fp); 
      printf("%2d\t %3d\t %4d\t %5d\t %6d\t %7d %8d\n", x.x1, x.x2, x.y1, x.y2, x.R, x.G, x.B); 
      //write struct linien to new file Linien.txt 
      fprintf(fpa, "%2d\t %3d\t %4d\t %5d\t %6d\t %7d %8d\n", x.x1, x.x2, x.y1, x.y2, x.R, x.G, x.B); 
     } 

     fclose(fp); // close file 
     fclose(fpa); // close file 
    } 
+0

_Ich habe eine Binärdatei mit ein paar Zeilen drin: das klingt etwas widersprüchlich. Eine Textdatei hat Zeilen, eine Binärdatei nicht. Jetzt sieht Ihr Code mehr oder weniger korrekt aus, möglicherweise liegt das Problem daran, dass die Strukturen in der Datei wegen der Auffüllung nicht mit der Struktur "struct linien" übereinstimmen. Wir können nicht ohne weitere Informationen sagen. Wie entsteht die Linien.pra? –

+0

'x' wird nie initialisiert, bitte posten Sie einen [MCVE] – purplepsycho

+0

Sie überprüfen nicht den Rückgabewert von fopen oder fread. – stark

Antwort

0

Er druckt nur die ersten 11 Zeilen

Mal sehen ....

struct linien 
{ 
    short x1, x2, y1, y2; 
    unsigned char R, G, B; 
}; 

int counter; 
struct linien x; 

// [...] 

for (counter = 0; counter < sizeof(x); counter++) 
{ 
    // code to read **one** instance of `struct linien` 
} 

etwas sehen? Was ist sizeof(x)? Wir haben 4 short und 3 char in struct linien - vorausgesetzt, Ihre typische Plattform, wo short hat eine Größe (und Ausrichtung Anforderung) von 2, das macht insgesamt 2 * 4 + 3 = 11. Überraschung? ;)

Du bist genau 11 mal dran, aus welchem ​​Grund auch immer. Also lies (und schreibst) 11 Gegenstände!

Stattdessen sollten Sie nur stoppen, wenn Ihr fread() Aufruf fehlschlägt (den Rückgabewert testen!).

+0

lol danke x'D – arsy

0

Sie sollten den Rückgabewert von fread überprüfen, so dass Sie fread in einer while-Schleife so verwenden können:

while (fread(&x, sizeof(x), 1, fp) != 0) 
{ 
} 
0

Achten Sie darauf, die Strukturen in der Datei Übereinstimmung mit der Struktur linien. Überprüfen Sie den Rückgabewert von fread, um zu prüfen, ob Sie das Ende der Datei erreicht haben.

Verwandte Themen