Почему ifstream возвращает последнее значение строк дважды?
в
size_t c;
while (1){
myfile >> c;
cells.push_back(c);
if (myfile.eof()) break;
}
for (int i = 0; i < cells.size(); i++) cout << cells[i] << endl;
с вводом
2 3
9 7 11
12 5 6
3 4
клетки [7] = клетки [8] = 4
Я сделал это с несколькими аналогично отформатированными входами, и он делает это для всех.
Идиоматический способ сделать это
while (myfile >> c){
}
Это полностью устраняет вашу проблему, так как eof() не достигается при чтении последнего значения, но когда поток не читается, поэтому после этого вы выполните другой push_back. Преимущество вышеприведенного в то время как конструкция заключается в том, что он немедленно сломается при сбое.
Вы всегда должны проверять результат операции ввода-вывода, прежде чем использовать возвращаемые данные.
В этом случае ваша проверка на eof()
должна предшествовать вызову push_back()
. Чтобы сделать код более безопасным, вы также должны добавить проверку для fail()
в потоке, так как поток может выйти из строя по другим причинам, кроме достижения EOF.