2016-05-31 5 views
0

Я учусь о том, как работать с файлами в 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, чтобы убедиться, что чтение прекращается, как мы хотели, и это нормально. Но у меня есть проблемы с пониманием второго примера:

  1. Что говорит автор, когда он говорит, чтобы удалить тест перед вызовом ошибки?

    1. Можно ли избежать срабатывания как eof, так и сбой при чтении? Если да, то как?

Я очень смущен, и я не могу понять, к примеру, так как из теста, который я сделал failbit всегда будет установлен после того, как eofbit, так что смысл проверки failbit, если он всегда будет срабатывать? Почему автор делает это?

ответ

1

Что произойдет с кодом, если я удалю тест перед вызовом ошибки, как говорит автор? Разве это не было бы бесполезно, поскольку я только проверял бы плохое состояние потока?

Я думаю, что вижу, что вы имеете в виду. Нет, это не бесполезно, потому что вы сказали бы кому-то (я не знаю, что на самом деле делает error), программист (исключение) или пользователь (стандартный вывод), что у данных были некоторые недопустимые данные, и кто-то должен действовать соответственно.

Это может быть бесполезно, но это зависит от того, что вы хотите от функции, если, например, вы хотите, чтобы он просто молча игнорировал ошибку и использовал правильные данные, уже обработанные, это действительно is бесполезно.

Как читать данные из файла, пока я не дойду до конца этого файла, не используя какой-либо другой терминатор?

Я не могу видеть, что вы имеете в виду, вы уже делаете, что в обоих примерах:

if (ist.eof()) return; // fine: we found end of file 

и

if (ist.fail()) { //If 'ist' didn't fail (reaching eof is not a failure), just skip 'if' 
+0

Я думаю, что я до сих пор путают, я пытался повторить второй пример, чтобы увидеть, что произойдет. Если я решит выбросить исключение с 'error()' в случае 'fail', проблема в том, что когда я дохожу до конца файла, я получаю как« fail », так и' eof 'как состояние потока' ist'. Я пробовал этот пример, читая 10 целых чисел из файла до 'eof'. –

+0

@PieroBorrelli вы уверены, потому что согласно [docs] (http://en.cppreference.com/w/cpp/io/basic_ios/fail) 'eof' не является провалом. Может быть, в конце был недопустимый символ (пробел?)? – Rakete1111

+0

После попытки с другими примерами я заметил, что вы правы и у меня есть файл, заканчивающийся пробелом. Теперь, если я пытаюсь прочитать файл без какого-либо недопустимого символа в конце, я получаю eof(), когда eof срабатывает точно? Когда я вернусь к последнему значению файла? –

 Смежные вопросы

  • Нет связанных вопросов^_^