2013-10-16 13 views
5

Mam wątpliwości co do kolejności sortowania parametrów i liczby do użycia dla fread/fwrite. Jeśli chcę przeczytać 8kb danych z pliku fp, który z poniższych jest bardziej wydajny?Fread/fwrite rozmiar i liczyć

fread(data,1,8192,fp) 
fread(data,8192,1,fp) 

Czy są też problemy z endiannes, o które powinienem się martwić?

Odpowiedz

11

Są dokładnie takie same. Co do endianizmu, to zależy od tego, co czytasz. Normalnie będzie to bufor bajtów, które będziesz musiał "unformatować", zgodnie z formatem, w jakim zostały napisane. A ponieważ jest to bajt, endianness nie odgrywa żadnej roli.

EDIT:

Jak simonc wskazał (a następnie usunięty, bo nie dostać 100% rację --- ale jego punktem był ważny): istnieje różnica w odniesieniu do wartości zwracanej (które musisz użyć, aby wiedzieć, czy funkcja zadziałała, czy nie). fread(buffer, 8192, 1, fp) zwróci 0 lub 1, a 1 tylko wtedy, gdy wszystkie 8192 bajty zostały przeczytane. Ponadto Posix twierdzi, że zawartość bufora nie jest określona dla obiektów częściowo odczytanych. W praktyce bufor zostanie wypełniony tyle bajtów, ile można odczytać, ale ponieważ nie wiesz, ile to było, nie za wiele ci to za dużo. Podsumowując, zawsze powinieneś używać fread(buffer, 1, 8192, fp); (ponieważ nie ma sensu używać tej funkcji do niczego poza buforem bajtów).

+0

Cóż, ponieważ jest to bajt, oczywiście endianness będzie odgrywać pewną rolę. Wyobraź sobie, że próbuje odczytać te 8kb danych do struktury, która ma na przykład członków "int". Zakładasz, że próbuje coś takiego jak "char string [] = fread (dane, 8192,1, fp);' – fvdalcin

+3

@fvdalcin On czyta bajty. Bajty nie mają endianizmu. Gdy je przeczyta, musi je zinterpretować zgodnie ze specyfikacjami formatu pliku. Zwykle należy to robić bez uwzględnienia endianizmu. –

+0

@fvdalcin I tak, jedynym rozsądnym zastosowaniem tych funkcji jest 'unsigned char buffer [8192]; fread (bufor, 8192, 1, fp); '. Następnie należy zinterpretować bufor zgodnie z określonym formatem pliku. –

2

Nie są dokładnie takie same.

fread() został źle zaprojektowany. Jego konstrukcja ignoruje możliwość częściowego odczytu na końcu pliku, który nie może być wyrażony przez jego wartość zwracaną, która jest w jednostkach o określonym rozmiarze.

Powinieneś używać tylko fread(), gdzie rozmiar to 1, a długość to liczba bajtów, których się spodziewasz. To jedyny sposób, w jaki możesz właściwie poradzić sobie z sytuacją. Dla typów innych niż char oznacza to dostarczanie sizeof char jako rozmiaru i n*sizeof T jako długości, gdzie n jest liczbą T s, których się spodziewasz.