Почему при чтении из файла while(!fin.eof()) {count++} последний символ выводится дважды, и количество символов на 1 больше чем в файле?


   #include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    std::ifstream fin;
    fin.open("file.txt");
    int count = 0;
     
    int probel = 0;
    while (!fin.eof())
    {
        char c;
        fin.get(c);
        if (c == ' ') probel++;
        count++;
    }
    std::cout << probel << endl;
    std::cout << count << endl;

    fin.clear();
    fin.seekg(0);

  char* fromFile = new char[count+1];
    
  for (int i = 0; i < count; i++) {
      char c;
      fin.get(c);
      fromFile[i] = c;
      cout << fromFile[i];
  }

    fin.close();
    delete[] fromFile;
    
}
    
}

Задача в том, чтобы считать все символы из файла в динамический массив с таким содержимым "hello, mister Bart ". В конце есть пробелы. Перед этим считаю количество символов, чтобы узнать какую задать размерность массива.

Я понял, что !fin.eof отработает уже после того, как возникнет ошибка чтения. Это значит, что если будет строка "hi", то символы 'h' и 'i' считаются без проблем. Не могу понять, почему когда мы зайдём в третий раз, то на экран снова выведется символ 'i' и будет строка "hii"? Ведь в этой итерации пересоздаётся переменная char c; Затем мы пытаемся считать несуществующий символ fin.get(c) в переменную c, получается, в переменной с должно быть какое-то пустое значение вроде {0,-1,f}. Но VS говорит что это не так. И возникают такие вопросы:

  1. fin.get(c) работает так, что он записывает в переменную c тот символ, который удалось считать, а если не удалось, то он записывает предыдущее. А как он знает предыдущее значение, оно записывается внутри метода или это как-то связано с самим потоком?
  2. Правильно ли я понял, что когда мы читаем несуществующий символ (конец файла), то на весь поток накладывается fin.fail() и поэтому мы должны писать fin.clear()?
  3. В таком динамическом массиве char тоже нужно добавлять +1 к размеру для нуль-терминатора?
  4. Как всё-таки правильно записать в массив fromFile данные из строки? Спасибо.

Ответы (0 шт):