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