2012-02-22 9 views
10

gdy czytam z pliku przy użyciu fread (języka C), wartość zwracana fread czasami byłoby 0.czy fread i fwrite mają awarię? jak sobie z tym poradzić?

Ponieważ instrukcja sugeruje:

fread() i fwrite() zwraca liczbę elementy pomyślnie przeczytane lub napisane

Czy muszę napisać kod w ten sposób?

int bytes_read; 
while((bytes_read = fread(buffer, sizeof(int), 1, fp)) == 0) { 

} 

czy zawsze musimy sprawdzić, czy udało się odrzucić fread lub fwrite?

Odpowiedz

11

Nie, nie ma sensu robić powtórzenia pętli w ten sposób, jeśli fread lub fwrite zwraca mniej niż oczekiwana liczba odczytów lub zapisów. Oznacza to, że stdio nie przypomina operacji niskiego poziomu read i write, które mogą powodować "krótkie" odczyty lub zapisy.

Jeśli fread zwróci mniej niż żądana liczba rekordów, oznacza to, że wystąpił błąd EOF lub poważny błąd odczytu. Możesz je odróżnić, sprawdzając feof() i ferror().

Podobnie, jeśli fwrite zwraca mniej niż żądana liczba rekordów, oznacza to, że zabrakło miejsca na dysku lub wystąpił poważny błąd zapisu.

W każdym przypadku, ze względu na buforowanie stdio, nie można w zasadzie dowiedzieć się, ile udało się napisać, więc jeśli napotkasz błąd zapisu, zwykle musisz wziąć pod uwagę utracony plik i przerwać całą operację.

0

Tak.

Wartość zwracana powinna zawsze wynosić liczba.

Jeśli nie, należy użyć ferror() lub feof(), aby ustalić, czy doszedłeś do końca pliku i/lub wystąpił błąd.

Ignorowanie błędów i/lub nieoczekiwanych warunków jest sprawą, z której niewiarygodne oprogramowanie zostało wykonane na niczego niepodejrzewających użytkownikach.

http://www.cplusplus.com/reference/clibrary/cstdio/fread/ < - Junk

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

+1

Nie, zwracana wartość to "count", a nie "size * count", gdy cała operacja się powiedzie. –

+0

@R .. - Uh ... Nie sądzę, że to prawda. Jesteś pewny? Masz dokumenty, które nie zgadzają się z tym, który opublikowałem? – Steve

+0

@R .. - Jestem prawie pewien, że jeśli poprosisz "5" o rozmiar "10", że odpowiedź powinna być "50", a nie "5". – Steve

4

http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html

Po pomyślnym zakończeniu, fread() powinna Zwróć liczbę poprawnie odczytanych elementów, która jest mniejsza niż liczba Nitemów tylko wtedy, gdy napotkasz błąd odczytu lub koniec pliku. Jeśli rozmiar lub nitem wynosi 0, fread() zwróci 0, a zawartość tablicy i stan strumienia pozostaną niezmienione. W przeciwnym razie, jeśli wystąpi błąd odczytu, należy ustawić wskaźnik błędu dla strumienia i ustawić errno, aby wskazać błąd. Funkcja

http://pubs.opengroup.org/onlinepubs/007904875/functions/fwrite.html

fwrite() zwraca liczbę elementów z powodzeniem napisane, którego mogą być mniejsze niż nitems jeśli błąd zapisu spotyka. Jeśli rozmiar lub nitem wynosi 0, fwrite() powinno zwrócić 0, a stan strumienia pozostanie niezmieniony. W przeciwnym razie, jeśli wystąpi błąd zapisu, należy ustawić wskaźnik błędu dla strumienia i ustawić wartość errno, aby wskazać błąd. Należy użyć funkcji ferror() lub feof(), aby rozróżnić warunek błędu i warunek końca pliku.

0

Jeśli fread się nie powiedzie, zwykle będzie się dalej dziać. Zazwyczaj dlatego, że trafiło na koniec pliku, ale możliwe, że z jakiegoś innego powodu. Jeśli zawiedzie, normalnie nie spróbujesz ponownie.

Powiązane problemy