Я учусь о том, как работать с файлами в C++ и как новичок я получил некоторые сомнения, что я хотел бы уточнить:Стандартный цикл для чтения из текстового файла C++
В моей книге автор вводит поток состояния и записывает этот простой кусок кода, чтобы показать, как читать, пока мы не достигнем конца файла или терминатором:
// somewhere make ist throw if it goes bad :
void fill_vector(istream& ist, vector<int>& v, char terminator)
{
ist.exceptions(ist.exceptions() | ios_base::badbit);
for (int i; ist >> i;) v.push_back(i);
if (ist.eof()) return; // fine: we found end of file
// not good() not bad() and not eof(), it must be fail()
ist.clear();
char c;
ist >> c; // read a character, hopefully terminator
if (c != terminator) { // not the terminator, so we must fail
ist.unget(); // maybe my caller can use that character
ist.clear(ios_base::failbit);
}
}
Это был первый пример, который содержит полезный метод для чтения данных, но У меня есть некоторые проблемы со вторым примером, где автор говорит:
Часто мы хотим, чтобы проверить наше чтение, как мы идем вместе, это общая стратегия при условии, что
ist
является «IStream»:
for (My_type var; ist >> var;) { // read until end of file
// maybe check that var is valid
// do something with var
}
if (ist.fail()) {
ist.clear();
char ch;
// the error function is created into the book :
if (!(ist >> ch && ch == '|')) error("Bad termination of input\n");
}
// carry on : we found end of file or terminator
Если мы не хотим, чтобы принять терминатор, т. е. принимать только конец файла o в качестве конца - мы просто удаляем тест перед вызовом ошибки().
Вот мои сомнения: В первом примере мы в основном проверить для каждого возможного состояния IStream, чтобы убедиться, что чтение прекращается, как мы хотели, и это нормально. Но у меня есть проблемы с пониманием второго примера:
Что говорит автор, когда он говорит, чтобы удалить тест перед вызовом ошибки?
- Можно ли избежать срабатывания как eof, так и сбой при чтении? Если да, то как?
Я очень смущен, и я не могу понять, к примеру, так как из теста, который я сделал failbit всегда будет установлен после того, как eofbit, так что смысл проверки failbit, если он всегда будет срабатывать? Почему автор делает это?
Я думаю, что я до сих пор путают, я пытался повторить второй пример, чтобы увидеть, что произойдет. Если я решит выбросить исключение с 'error()' в случае 'fail', проблема в том, что когда я дохожу до конца файла, я получаю как« fail », так и' eof 'как состояние потока' ist'. Я пробовал этот пример, читая 10 целых чисел из файла до 'eof'. –
@PieroBorrelli вы уверены, потому что согласно [docs] (http://en.cppreference.com/w/cpp/io/basic_ios/fail) 'eof' не является провалом. Может быть, в конце был недопустимый символ (пробел?)? – Rakete1111
После попытки с другими примерами я заметил, что вы правы и у меня есть файл, заканчивающийся пробелом. Теперь, если я пытаюсь прочитать файл без какого-либо недопустимого символа в конце, я получаю eof(), когда eof срабатывает точно? Когда я вернусь к последнему значению файла? –