2015-03-08 7 views
0

В настоящее время я пытаюсь прочитать ввод из текстового файла только с одной строкой на C++; Я могу извлечь одну строку текста из файла успешно в строку, используя std :: getline (файл, строка). После извлечения строки больше нет текста. Когда я пытаюсь проверить состояние потока, он никогда не вернет false при вызове file.good(), и будет достигнут известный «конец» файла. Почему это? Смотрите ниже код:Конец файла и состояние входного потока C++

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

    ifstream file; 
    string test; 
    file.open("HW6.txt");//HW6.text is one line text file 
    getline(file,test);//extracts the line of text; file should be blank now 
    cout<<file.good(); //this returns true 
    getline(file,test); //attempt to extract text from blank file 
    cout<<file.good(); //this returns true still 

ответ

0

Существует очень хорошее резюме, в табличной форме, о том, когда istream::good() возвращается true и false в http://en.cppreference.com/w/cpp/io/basic_ios/good.

istream::good() возвращает Истинные только тогда, когда ни один из следующих флажков не является истинным:

eofbit 
failbit 
badbit 

В вашем случае, поток все еще находится в хорошем состоянии, так как вы не пытались читать ничего другого после успешного чтения линия.

+0

Дополнительные вызовы getline и звонки в good() после первоначального вызова по-прежнему возвращают true. Простите, я забыл упомянуть об этом в оригинальном посте. – Davey

+0

В своем обновлении вы сказали «пустая строка». Это все еще допустимая строка в отношении 'std :: getline()'. –

+0

Итак, если бы я построил цикл while для извлечения нескольких строк, то какой условный оператор завершит чтение после того, как будут прочитаны все строки из файла. По сути, конец файла был достигнут? Я хочу зациклиться, пока есть текст. Когда текста больше нет, я хочу, чтобы цикл был выполнен. – Davey

0

Вот пример, взятый из cplusplus.com.

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main(int argc, char **argv) 
{ 
    string line; 
    ifstream f(argv[1]); 
    if (f.is_open()) { 
    while (getline (f,line)) { 
     // if (line.size()) 
     cout << line << endl; 
    } 
    f.close(); 
    } else cerr << "Unable to open file " << argv[1] << endl; 

    return 0; 
} 

Вы можете раскомментировать if заявление, если вам не нужны пустые строки.

+0

while (getline, f, line) в моих случаях бесконечно. Любая идея, почему это может быть? – Davey

+0

Должно быть опечатка в коде. 'getline' возвращает false, когда пытается прочитать файл. – SU3