Превъртане назад на обект ifstream след достигане на края на файла

Имайки текстов файл с няколко знака (да кажем 10), можете да опитате да прочетете 1000 знака от него.

char *buf = new char[1000];
ifstream in("in.txt");
in.read(buf, 1000);

Това, разбира се, ще зададе флага eofbitfailbit също), но ще можете да получите желаните знаци.

Сега да предположим, че искате да прочетете файла отново (от началото):

in.seekg(0);        // Sets input position indicator. 
in.read(buf, 100);  // Try to read again.

Това не работи: защото ако се обадите:

int count = in.gcount()  // Charecters readed from input.

ще забележите, че count == 0. Което означава, че не е чел абсолютно нищо.

Оттук и въпросът: Как можете да превъртите файла назад, след като стигнете до края на файла?


person Raydel Miranda    schedule 04.02.2015    source източник


Отговори (1)


Решение

Използвайте clear за почистване на състоянието на ifstream преди извикване seekg. Не забравяйте да проверите първо, ако не е необходимо да знаете състоянието по-късно.

in.clear();
in.seekg(0);

Обяснение

seekg задава позицията на курсора, но не изчиства< /strong> бит за състояние фаилбит, така че ifstream екземпляр смята, че все още има нещо нередно.

От стандартната спецификация:

std::basic_istream::seekg се държи като UnformattedInputFunction , освен че gcount() не е засегнат.

И можем да прочетем в UnformattedInputFunction:

Следните стандартни библиотечни функции са UnformattedInputFunctions:

basic_istream::seekg, освен че първо изчиства eofbit и не променя gcount

В примера с въпроса, ако отпечатате състоянието преди и след seekg, получавате:

cout << "State before seekg: " << in.rdstate() << endl;   // Prints 3 (11 in binary) failbit and eofbit activated.
in.seekg(0);
cout << "State after seekg: " << in.rdstate() << endl;    // Prints 2 (10 in binary) just failbit activated.

Ето защо!!

seekg не изчиства failbit и по някаква причина за внедряване не го прави t работи с активиран такъв бит.

Моето предположение

Защо seekg не работи, когато failbit е активиран?

Това е свързано с факта, че този бит не се активира само когато потокът достигне края на файла. И може да има ситуации, при които след активиране на failbit, използването на seekg е податливо на грешки или може да показва недефинирано поведение.

person Raydel Miranda    schedule 04.02.2015