Pytanie do znawców, semantyka feof i fread

0

Witam,

Próbuję napisać własny kompresor danych, bazowany na tym algorytmie wyszukiwania powtórzeń: http://encode.ru/threads/1155-A-new-match-searching-structure

Ale nie o algorytmy mi chodzi. Chodzi mi o zachowanie się feof i fread. Chcę, aby mój program działał na standardowym wejściu i wyjściu, a więc raczej użycie fseek, ftell itp nie wchodzi w grę.

Mój kompresor będzie wczytywał i kodował blokami (o rozmiarze milion bajtów), w przesuwającym się oknie może mieścić się wiele bloków. Okno skracam i przesuwam dopiero gdy zostanie wypełnione do końca danymi (tzn blokami danych, bo rozmiar okna dzieli się przez rozmiar bloku). Chcę też, do struktury wyszukującej powtórzenia wstawiać ciągi, które przekraczają granicę bloku, o ile nie jest to ostatni blok w oknie (wtedy grzebałbym w śmieciach), a więc czytam także jeden blok wprzód.

I tu pytanie, czy mogę polegać na jakiejkolwiek funkcji POSIXowej, która powiedziała by mi czy znajduję się na końcu pliku (tzn na standardowe wejście przestałyby być wysyłane dane) bez wczytywania danych?

Drugie pytanie to czy fread z ustalonym parametrem nitems/ nmemb/ <cośtam>, określającym ilość jednostek danych (u mnie bajtów) do wczytania z pliku zawsze wczytuje tyle jednostek danych jeżeli nie napotka końca pliku/ strumienia? Czy też może się zdarzyć że zażądam wczytania 100 bajtów, ale fread wczyta 50 bajtów mimo tego, że nie napotka końca strumienia/ pliku i następne wywołania fread będą wczytywać dane?

Aktualnie szkielet programu znajduje się tutaj: http://code.google.com/p/lzt/source/browse/compress.cpp?r=411ab70c04d997c31f3ac0bdcf5c7419ef05a52c

0
Wibowit napisał(a)

I tu pytanie, czy mogę polegać na jakiejkolwiek funkcji POSIXowej, która powiedziała by mi czy znajduję się na końcu pliku (tzn na standardowe wejście przestałyby być wysyłane dane) bez wczytywania danych?

select?

Wibowit napisał(a)

Drugie pytanie to czy fread z ustalonym parametrem nitems/ nmemb/ <cośtam>, określającym ilość jednostek danych (u mnie bajtów) do wczytania z pliku zawsze wczytuje tyle jednostek danych jeżeli nie napotka końca pliku/ strumienia? Czy też może się zdarzyć że zażądam wczytania 100 bajtów, ale fread wczyta 50 bajtów mimo tego, że nie napotka końca strumienia/ pliku i następne wywołania fread będą wczytywać dane?

Przy czytaniu z pliku i stdin fread() powinien blokować dopóki nie wczyta zadanej ilości bajtów lub nie napotkasz końca pliku. Jeśli jednak będziesz czytał z FIFO (zrobionej przez mknod), to wtedy źródło zachowuje się jak strumień i fread() może Ci wrócić zanim odczyta wszystko. Tego można chyba uniknąć odpowiednio dobierając ilość danych do odczytania (w bajtach), tak aby była ona wielokrotnością bufora systemu, ale nie próbowałem. Przy czytaniu z FIFO zawsze daję odczyt w pętli. (wróć, ja używam read(), nie fread(), więc tutaj może być inaczej).

W manualu do fread stoi jednak: Upon successful completion, fread() shall return the number of elements successfully read which is less than nitems only if a read error or end-of-file is encountered. To only wskazuje, że fread() nie powinien Ci wrócić, jeśli nie odczyta tyle, ile chcesz (lub EOF lub fuckup).

0

select to służy chyba do monitorowania dostępności nieblokujących odczytów z plików. Przynajmniej jak tak zrozumiałem manuala.

No cóż, pozostaje posługiwanie się samym freadem :(

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