ifstream i eof

0

Mam problem z wczytywaniem z pliku. Zapisuję do pliku strukturę drzewa bajt po bajcie. Potem próbuję ją odczytać i dzieje się coś dziwnego. Inicjuję:

ifstream infile;
infile.open(path);

Natomiast do odczytywania wykorzystuję pętlę:

while(!infile.eof()) {

Problem polega na tym, że pętla robi o jeden przebieg więcej niż trzeba. Tzn. jak odczytam tyle bajtów ile jest w pliku (sprawdziłem rozmiar na dysku i zliczam w zmiennej ile bajtów wczytuję) to .eof() zwraca false, natomiast jak tylko wczytam jeszcze jeden bajt (czyli taki, którego w pliku już nie ma) to .eof() zwraca true.
Czy takie zachowanie się programu jest normalne/wytłumaczalne czy raczej ja coś źle zliczam? (co jest bardzo mało prawdopodobne, bo tworzę pliki po kilkanaście bajtów i debuguję linia po linii)

0

Tak, takie zachowanie jest normalne. Przyczyną tego jest to, że flaga eof jest ustawiana dopiero jak próbujesz przeczytać coś poza rozmiarem pliku. Czyli np. plik ma 100 bajtów. Przeczytałeś równo 100 bajtów to eof nie jest jeszcze ustawiony. Teraz spróbujesz przeczytać dalej to strumień wejdzie w stan błędu i dopiero wtedy pojawi się eof. Nie wiem jak wczytujesz, ale zamiast tego warunku możesz wrzucić np. infile >> cosTam;

0

Wczytuję w sposób następujący:

while(!infile.eof()) {
    infile.read((char*)&posx, sizeof(float));
    infile.read((char*)&posy, sizeof(float));
    infile.read((char*)&posz, sizeof(float));
    infile.read((char*)&edge, sizeof(float));
    infile.read((char*)&height, sizeof(unsigned int));
    //reszta pętli

Więc może dam if'a po pierwszym read, bo przy poprawnym działaniu pętla przy którymś swoim obrocie wczyta równo tyle bajtów, ile ma plik.

0

Albo tak zrób:

while(infile.read((char*)&posx, sizeof(float))) 
{
    ...

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