2015-10-16 3 views
1

Я пытаюсь прочитать в тексте из файла, и это то, что я делаю:Почему я дважды читаю последнее слово в своем файле?

int main(int argc, char* argv[]) 
{ 

ifstream inFile; 
inFile.open(argv[1]); 

string item; 

while(inFile.good()) 
{ 
    inFile >> item; 
    cout << item << " " << endl; 
} 

По какой-то причине он будет читать последнее слово в файле дважды. Я попытался использовать переменную count, чтобы отслеживать, сколько раз она входит в цикл while, и она всегда вводит один раз больше, чем общее количество строк в файле. Я думаю, что это происходит, потому что оператор inFile.good() не возвращает false достаточно скоро. Как можно это исправить?

+1

Вы также должны добавить шаблон файла (если он не слишком длинный) – Arne

+1

Файл может быть «хорошим», но следующий элемент 'inFile >> может все еще не работать, и вы все равно вывозите его. –

ответ

2

Вы не тестируете, если

inFile >> item; 

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

Вы можете проверить успех >> как выражение bool, это должно работать;

if (inFile >> item) 
    cout << item << " " << endl; 
+0

Итак, что я могу сделать, чтобы поймать его? Я попробовал параметр 'inFile >> item;' как параметр, но теперь он пропускает первую строку и все еще читает последнюю строку дважды. –

+0

Он вернет значение bool true или false, просто проверьте, что с if-statment – Soren

1

Последнее чтение не удается, но вы его не поймаете. Переменная просто сохраняет предыдущее значение.

Изменить петлю на:

while(inFile >> item) 
{ 
    cout << item << " " << endl; 
} 
+0

Я пробовал это. Теперь он пропускает первую строку и все еще читает последнюю строку дважды. –

0

Другие люди показали код, который вы должны написали, так что я просто хочу, чтобы объяснить, почему ваш код не работает.

istream.good(), действительно, «не возвращает ложных достаточно скоро». Это все равно будет верно после того, как вы прочтете последний элемент в файле. Он становится ложным только тогда, когда вы пытаетесь прочитать один элемент за конец файла.

Все различные способы задать вопрос «дошел ли я до конца файла?». в C и C++ имеют одинаковую семантику. Это связано с тем, что основной примитив ОС read не может возвращать данные и сигнал EOF одновременно.

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