2013-03-29 13 views
5

Więc nie jestem do końca pewien, jak używać FDA. Mam plik binarny w little-endian, który muszę przekonwertować na big-endian i nie wiem, jak go odczytać. Oto co mam do tej pory:W jaki sposób fread wie, kiedy plik kończy się w C?

FILE *in_file=fopen(filename, "rb"); 
char buffer[4]; 
while(in_file!=EOF){ 
    fread(buffer, 4, 1, in_file); 
    //convert to big-endian. 
    //write to output file. 
} 

nie mam nic innego nie napisałeś, ale ja po prostu nie wiem, jak dostać fread do „postępu”, że tak powiem. Każda pomoc będzie doceniona.

+0

Uzupełnij program i uruchom go! 'fread' będzie czytać od miejsca, w którym zostało przerwane po raz ostatni w pętli. Powinieneś sprawdzić wartość zwracaną przez 'fread'. 'infile' nie jest porównywalne do' EOF'. –

+4

Pierwszym krokiem do osiągnięcia postępu jest ** przeczytanie dokumentacji **. –

+1

Po pierwsze, "rb" oznacza ** R ** ead ** B ** inary, więc twoja tablica powinna być typu int, a nie char. – MarcusJ

Odpowiedz

13

to nie jak prawidłowo odczytać z pliku w C

fread zwraca size_t reprezentująca liczbę elementów czytać pomyślnie.

FILE* file = fopen(filename, "rb"); 
char buffer[4]; 

if (file) { 
    /* File was opened successfully. */ 

    /* Attempt to read */ 
    while (fread(buffer, 1, 4, file) == 4) { 
     /* byte swap here */ 
    } 

    fclose(file); 
} 

Jak widać, powyższy kod będzie przestać czytać jak najszybciej fread wydobywa coś innego niż 4 elementów.

+2

Proponuję 'while while (fread (bufor, 1, 4, plik) == 4) {...}' w celu zapewnienia, że ​​4 bajty są odczytywane i unikają nieokreślonego zachowania przy użyciu niezainicjowanych wartości. – Sebivor

+0

Dzięki za wniesienie tego. Właśnie zdałem sobie sprawę, że powinienem używać 1 dla rozmiaru i 4 dla hrabiego. A także świetna nazwa bro! –

+0

Rzeczywiście. Jednak tego nie zauważyłem. Moja uwaga dotyczyła wyraźnego porównania wartości zwracanej do 4, a nie 0, ponieważ jeśli fread miałby zwrócić 3, 2 lub 1, to w buforze byłyby niezainicjowane bajty, co spowodowałoby niezdefiniowane zachowanie, gdyby te wartości były użyte. – Sebivor

Powiązane problemy