2016-10-03 3 views
-1

Вот код. Он дает EXACT-выход, как показано ниже, означает, что он читает файл. Но он также показывает fails, как вы можете видеть, это означает, что fin.fails() is true. Я хочу знать, почему это правда, хотя я успешно читаю файл.Почему входной объект потока не удается после чтения файла до конца?

#include<fstream> 
#include<iostream> 
using namespace std; 
int main() 
{ ifstream fin; 
    fin.open("pro.txt"); 
    char ch; 
    int data; 
    while(!fin.eof())//!(fin >> ch).eof() 
    { 
     fin.get(ch); 
     cout<<ch; 
     if(fin.fail()) { 
      cout<<"fails"; 
     break; 
     } 
    } 
    fin.clear(); 
    fin.seekg(0); 
    int pos=(int)fin.tellg(); 
    cout<<"\n this is :"<<pos; 
    fin.close(); 
    return 0; 
} 

Output is : 
this is my name 
fails 
this is 0 

Contents of pro.txt: 
this is my name 

Не знаю, почему это происходит!

+1

[OT] Не используйте 'eof' для условия цикла: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – NathanOliver

+0

то что использовать? а также почему fin.fails истинно – akitsme

+0

Правильный способ - использовать операцию чтения. – NathanOliver

ответ

0

До сих пор не могу найти, почему fin.fails() верно, потому что я не думаю, что никто не готов Но я понял, читать пробелы и файл без fin.fails() = true. просто замените while(!fin.eof()) на while(fin.get(ch)) и удалите fin.get(ch), присутствующий в то время как тело -> вот почему мой вывод пропускал по одному символу для каждого чтения .. это я упомянул в комментариях.

+0

Да, я упомянул об этом и в комментариях, но вы сказали, что я ошибался. : smh: –

+0

Я этого не говорил! я знаю, что это была моя ошибка, и «fin >> ch' не управляет пробелами. Попробуйте сами. – akitsme

+0

Это первый раз, когда вы упоминали пробелы .... –

0

Проблема заключается в следующем: чтение последнего символа в файле с get будет не установить eofbit, поэтому вызов fin.eof() в вашем while состоянии все еще возвращается false после прочтения последнего символа файла внутри тело петли. Затем во время итерации, следующей за чтением последнего символа, вы пытаетесь прочитать другой символ внутри тела цикла, даже если персонаж больше не читается. Это установит eofbitиfailbit согласно specification of get.

TL; DR: Чтение в конце файла должно установить failbit.