none
ifstream::eof(); RRS feed

  • Вопрос

  • Здравствуйте. Нашёл я такую программу:

    #include"stdafx.h"
    #include"iostream"
    #include"fstream"
    using namespace std;
    int main(int argc,char *argv[]){
     setlocale(LC_ALL, "Ru");
     char ch;
     if (argc != 2){
      cout << "Применение: имя_программы <имя_файла>\n";
      return 1;
     }
     ifstream in(argv[1], ios::in | ios::binary);
     if (!in){
      cout << "Не удаётся открыть файл.\n";
      return 1;
     }
     while (!in.eof()){
      in.get(ch);
      if (!in.eof()) cout << ch;
     }
     in.close();
     system("pause");
     return 0;
    }

    и всё в ней хорошо, да вот что-то мне показалось, что в строке:

     if (!in.eof()) cout << ch;

    не нужно условное выражение и надо сразу выводить значение ch, а оказалось, что всё-таки надо. В противном случае Последний символ выводиться два раза. Скажите пожалуйста, почему так происходит? Спасибо.

    5 февраля 2015 г. 21:47

Ответы

  • Значение eof должно проверяться после операции in.get(ch), потому что eof устанавливается в true при попытке считать байт за концом файла. В этом случае из потока ничего не считывается и в переменной находится посл. символ. Правильный код:

    while (true){
      in.get(ch);
      if(in.eof())break;
      cout << ch;
     }

    6 февраля 2015 г. 3:15