Сложность использования file.seekg () (C ++)

Следующий код печатает файл только один раз:

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, const char *argv[])
{
ifstream infile;
infile.open("in", ios::binary);
char c;

while (infile.get(c))
{
cout << c;
}

infile.seekg(0, ios::beg);
infile.clear();

while (infile.get(c))
{
cout << c;
}
infile.close();
return 0;
}

Я предполагаю, что это как-то связано с флагом eof после запуска файла, но я не знаю, как это исправить.

Приветствия.

1

Решение

Есть несколько проблем с вашим кодом:

Во-первых, вы не проверяете это infile.get() успешно перед использованием
его результаты, когда-либо. И вы используете infile.good() контролировать
один цикл, и infile.eof() контролировать другого: infile.eof()
бесполезно, пока вы не знаете, что ввод не удался, и
infile.good() никогда не бывает действительно полезным. Просто используйте while
( infile.get( c ) )
для обеих петель.

Во-вторых, как вы говорите, вы никогда не сбрасываете «ошибку», которая вызвала у вас
закончить первый цикл. Как только вы встретили конец
файл (и infile.get( c ) не удалось), вам нужно позвонить
infile.clear() прежде чем делать что-либо еще.

Наконец, конечно, вы не можете проверить, успешно ли вы
открыл файл, и был ли seekg удалось. а вы
как правило, не нужно закрывать входной файл; это будет закрыто
автоматически, когда он выходит из области видимости. (С другой стороны,
вы должен или близко или вровень std::coutи убедитесь, что
это все еще хорошо потом. возврате 0 когда вы не смогли
написать все данные является серьезной ошибкой в ​​моей книге.)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]