fread(), size i nitems

0

Jak pewnie wszyscy wiecie prototyp fread() wygląda tak:

size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

i gdy chcemy odczytać np. 10 bajtów to możemy to zrobić tak, że:

size = 10; nitems = 1;
size = 1; nitems = 10;
size = 5; nitems = 2;
etc... etc...

Nie jest to bez różnicy, gdyż funkcja fread() zwraca liczbę odczytanych pełnych bloków o rozmiarze size, ale odczytuje również tą "niepełną" cząstkę bloku do buforu.

I teraz moje 2 pytania dla speców od OSów:

  • czy na wszystkich obecnie stosowanych platformach jest odczytywany ten niepełny blok?
  • czy na obcnie stosowanych platformach ma to jakieś znaczenie optymalizacyjne, czy i tak jest to buforowane przez OS i nie ma znaczenia?

Opolski Portal Programistyczny
http://programowanie.opole.pl

0

fread próbuje odczytać size*nitem bajtów do podanego bufora, jeżeli mu się udało to zwraca ci nitem, jeżeli nie udało się zaś udało się odczytać K (gdzie K<nitem) bloków o rozmiarze size to zwraca ci to K, jeżeli udało mu się odczytać K pełnych bloków oraz jeszcze coś to oznacza że masz błędnie skonstruowany program lub uszkodzone dane (jeżeli to problem z danymi to masz automatyczną "naprawę" odczytuje się tyle ile się da).

Jest wiele implementacji biblioteki standardowej, każdy kompilator dostarcza w komplecie jakaś wersje, wszystkie się różnią pod względem implementacji, więc nie chodzi tu nawet o platformę. Standard właściwie nie przyjmuje się (i nie powinien) przypadkami niewłaściwego użycia funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1