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