2016-05-16 1 views
-1
#define SIZE 30 

// some code 
ifstream outFile; 
outFile.open("lab.txt"); // opening lab document which has a sentence 
char buffer[SIZE];   // buffer for storing the sentence when reading from file 

while (!outFile.eof())  // reads lab.txt until eof 
{ 
    // two methods for output to screen which print sentence on debugging 
    // but program doesn't terminate 
    outFile >> buffer; 
    cout << buffer << endl; 

    // outFile.getline(buffer, SIZE); 
    // cout << buffer << endl; 
} 

Этот код предназначен для чтения из файла последовательности, например lab.txt. Проблема в том, что, когда я запускаю предложение в файле, я печатаю, но за ним следует бесконечный цикл, который продолжает печатать пробелы, поэтому программа никогда не заканчивается. Я пробовал оба способа, но оба результата одинаковы. Любая помощь будет приветствоваться?Бесконечная петля возникает при чтении из файла в C++

+0

Не используйте '.eof()' – Rakete1111

+0

@ Rakete1111 Теперь оно не печатать ничего. –

+0

Что вы тогда использовали? Вы должны перебрать возвращаемое значение 'operator <<'. http://stackoverflow.com/questions/7868936/read-file-line-by-line – Rakete1111

ответ

1

Правильный способ чтения из файла выглядит следующим образом:

while(outFile >> buffer) { 
    cout << buffer << endl; 
} 

Использование outFile.eof() как условие является проблематичным.

+0

Спасибо, что сработали .. :) –

+0

@ F.T. Затем переверните и примите. – Matsmath

+1

@ F.T. Обратите внимание, что это не только позволяет вам различать ошибки и достигать успешного завершения файла. Чтобы получить полное представление о проблемах, я предлагаю прочитать что-то вроде [«правильное обращение с badbit, failbit, eofbit и perror()»] (https://gehrcke.de/2011/06/reading-files-in- с-помощью-ifstream-дилинг-правильно-с-badbit-failbit-eofbit-и-PError /). – HostileFork

1

просто использовать

while(outFile.getline(buffer, SIZE)) 
{ 
    ..... 
} 

вместо outFile.eof()

+0

Правильная идея, но почему 'getline'? – user4581301

+0

первый перегруженный оператор >> не будет принимать ведущие пространства, поэтому лучше использовать getline. вторая getline обрабатывает проблему переполнения буфера. Было бы намного лучше, если бы мы использовали std :: string line; здесь и проверяйте while (getline (outfile, line)) –

+1

Точка переполнения буфера хорошо взламывается, но это приводит к сдвигу ввода в линию на основе токенов. Когда вы меняете способ работы кода OP, вы должны объяснить в ответ, почему вы внесли изменения и как ваше решение лучше. – user4581301

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