Я читаю файл, но во время чтения он читает последний символ один раз дополнительно?

#c

#c

Вопрос:

Я пытаюсь прочитать файл следующим кодом

 void main()
{ 
   int i=0;
   ifstream fout1 ("Aj.txt",ios::binary);
   if (fout1.is_open())
   {
      while(fout1)
      {
         i  ;
         fout1.get(ch1);
         cout<<ch1;
      }
      cout<<i;
      fout1.close();
    }
    else
    { 
       cout << "Unable to open file";
    }
    return 0;
 }
  

здесь этот код считывает весь файл, но он переходит в цикл еще один раз, т. Е. Если в файле есть 4 символа, то в цикле он будет повторяться 5 раз. как это исправить или преодолеть.

Комментарии:

1. while (fout1.get(ch1)) { cout << ch1; i }

Ответ №1:

Этот код читается до тех пор, пока не будет установлен eof флаг, но eof флаг не будет установлен до тех пор, пока чтение фактически не завершится неудачей. Что означает, что когда fout1.get(ch1) считывается последний символ, он еще eof не установлен. ………. Еще. Таким образом, он отображает и проверяет fout , что все еще хорошо, поэтому он снова входит в цикл. Затем fout1.get(ch1) происходит сбой из-за eof, и он снова отображает предыдущее значение ch1 . Правильный способ записи этого цикла:

 while(fout1.get(ch1)) {  //false when it can't read any more characters
    i  ;
    cout<<ch1;
}
cout<<i;
fout1.close();
  

Ответ №2:

После чтения 4-го символа поток все еще находится в хорошем состоянии, поэтому он пытается прочитать 5-й символ, и в это время он обнаруживает конец файла. Вы должны проверить состояние потока после вызова get . Например:

 while( fout1.get(ch1) )
{
    cout << ch1;
      i;
}
  

Ответ №3:

Это простая ошибка, которую можно совершить, если вы не знакомы с iostreams. stream.eof() будет false, если вы просто прочитали последний символ в файле. Это становится правдой только тогда, когда вы пытаетесь прочитать после конца файла. Вам нужен внутренний цикл, который выглядит следующим образом:

 for (;;)
{
    fout1.get(ch1);
    if (!fout1) break;
    cout << ch1;
    i  ;
}