2013-10-15 3 views
0

В C++ я пытаюсь прочитать файл и сохранить строки из этого файла в строку в программе. Это отлично работает, пока я не доберусь до последнего слова, которое всегда хранится дважды.одно и то же слово добавлено дважды

ifstream inputStream; 
string next = ""; 
string allMsg = ""; 
inputStream.open(fileName.c_str()); 
string x; 

while (!inputStream.eof()) 
{ 
    inputStream >> x; 
    next = next + " " + x; 
} 
cout << "The entire message, unparsed, is: " << next << endl; 

Выполнение этого добавляет последнее слово или int из файла, который я открываю для следующего. Какие-либо предложения? Благодаря!

+3

[ 'в то время как (! EOF())' неправильно.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside -a-loop-condition-accepted-wrong) – chris

ответ

3

Это происходит потому, что, когда вы читаете последнюю строку, он не будет установлен ВФ бит и терпеть неудачу немного, только тогда, когда вы читаете END, ВФ бит установлен и eof() возвращает истину.

while (!inputStream.eof()) // at the eof, but eof() is still false 
{ 
    inputStream >> x; // this fails and you are using the last x 
    next = next + " " + x; 
} 

изменить его

while(inputStream >> x){ 
    // inputStream >> x; dont call this again! 
    next = next + " " + x; 
} 
+0

Это не работает, потому что теперь он читает только в каждом другом слове. Поэтому, если файл сказал «один два три четыре пять», теперь он только сохраняет «одну три пятерки» в следующую. – robertjskelton

+0

вы не называете 'inputStream >> x;' внутри цикла ... –

0
while (!inputStream.eof()) 

Должен быть

while (inputStream >> x) 
+0

@ZacHowlandx Почему? ... – 0x499602D2

+0

@ 0x499602D2 - об этом уже много раз ответили: http://stackoverflow.com/questions/5605125/why-is-iostreameof- in-loop-condition-accepted-wrong –

-1

EOF() возвращает истину, если последнее чтение попало в конце файла, а не если следующая операции чтения ударит конец файла. Попробуйте:

ifstream inputStream; 
string next = ""; 
string allMsg = ""; 
inputStream.open(fileName.c_str()); 
string x; 

inputStream >> x; 
if(!inputStream.eof()) { 
    do { 
     next = next + " " + x; 
     inputStream >> x; 
    } while (!inputStream.eof()) 
} 
cout << "The entire message, unparsed, is: " << next << endl; 
+0

Это не должно быть принятым ответом. Zac Wrangler является точным и более полным. Это просто неправильно. –

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