File echo loop с дополнительной финальной итерацией - PullRequest
1 голос
/ 07 октября 2009

Почему я получаю дополнительную итерацию (вывод дополнительной строки) после завершения этого кода? Должен ли быть дополнительный перевод строки в EOF? Я бы предпочел не добавлять дополнительные / специальные символы для пометки EOF.

#include <iostream>  
#include <fstream>  
#include <string>  
using namespace std;  

int main(){  
    ifstream infile("dictionary.txt"); // one word per line  
    string text;  
    while(infile){  
        infile >> text;  
        cout << text << endl;  
    }  
    infile.close();  
    return 0;  
}  

Ответы [ 5 ]

6 голосов
/ 07 октября 2009

Входной поток не обнаруживает конец файла до тех пор, пока после вы не попытаетесь прочитать за ним. Когда вы читаете последнее слово в файле, поток ввода остается действительным; в следующем цикле infile >> text пытается прочитать прошедший EOF и завершается неудачно, но следующая строка все равно выполняется.

Цикл должен выглядеть следующим образом:

while (infile >> text)
    cout << text << endl;

Таким образом, EOF будет обнаружен до того, как попытается записать на выход.

6 голосов
/ 07 октября 2009

1001 * попробовать *

while(infile>>text) cout << text << endl;

вместо.

3 голосов
/ 07 октября 2009

В конце файла infile может по-прежнему иметь значение true, но следующее извлечение слова с infile >> text завершится неудачно. Даже если это не удастся, вы все равно распечатаете строку. Лучший способ сделать это - позволить циклу while проверять успешность извлечения:

string text;
ifstream infile("dictionary.txt"); // one word per line  
while (infile >> text) {
    cout << text << endl;  
}
infile.close();
3 голосов
/ 07 октября 2009

С помощью условия while вы проверяете, находится ли поток в хорошем состоянии. Затем вы читаете из потока, что может или не может быть успешным. Затем вы выводите значение текста. Что вы должны сделать, это:

while(infile >> text){
    cout << text << endl;
}
1 голос
/ 07 октября 2009

Вы уже получили ряд исправлений, но, возможно, стоит рассмотреть несколько иное:

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

using namespace std; // not really a good idea, but harmless enough for now.

int main() { 
    ifstream infile("dictionary.txt");
    copy(istream_iterator<string>(infile), istream_iterator<string>(), 
        ostream_iterator<string>(cout, "\n"));
    return 0;
}
...