Следующий код печатает файл только один раз:
#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 после запуска файла, но я не знаю, как это исправить.
Приветствия.
Есть несколько проблем с вашим кодом:
Во-первых, вы не проверяете это infile.get()
успешно перед использованием
его результаты, когда-либо. И вы используете infile.good()
контролировать
один цикл, и infile.eof()
контролировать другого: infile.eof()
бесполезно, пока вы не знаете, что ввод не удался, и
infile.good()
никогда не бывает действительно полезным. Просто используйте while
для обеих петель.
( infile.get( c ) )
Во-вторых, как вы говорите, вы никогда не сбрасываете «ошибку», которая вызвала у вас
закончить первый цикл. Как только вы встретили конец
файл (и infile.get( c )
не удалось), вам нужно позвонить
infile.clear()
прежде чем делать что-либо еще.
Наконец, конечно, вы не можете проверить, успешно ли вы
открыл файл, и был ли seekg
удалось. а вы
как правило, не нужно закрывать входной файл; это будет закрыто
автоматически, когда он выходит из области видимости. (С другой стороны,
вы должен или близко или вровень std::cout
и убедитесь, что
это все еще хорошо потом. возврате 0
когда вы не смогли
написать все данные является серьезной ошибкой в моей книге.)
Других решений пока нет …