Не работает чтение текстового файла в C++
В цикле While получаю ввод из текстового файла с проверкой на EOF, в итоге последний символ в файле зацикливается и выводится бесконечно, какая-то проблема с EOF, при том что этот файл я создаю ранее в коде ниже. Подскажите почему так и как это исправить?
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
const int f_size = 50;
int main(void)
{
int u_age;
char ch;
std::string u_name, u_city, f_name;
std::ofstream u_txt1;
std::cout << "Enter your name: ";
std::cin >> u_name;
std::cout << "Enter your age: ";
std::cin >> u_age;
std::cout << "Enter your city: ";
std::cin >> u_city;
f_name = u_name + "_info.txt";
u_txt1.open(f_name);
u_txt1 << "Your name is " << u_name << std::endl;
u_txt1 << "Your age is " << u_age << std::endl;
u_txt1 << "Your city is " << u_city;
u_txt1.close();
std::ifstream u_txt2;
u_txt2.open(f_name);
if (!u_txt2.is_open())
{
std::cout << "Couldnot open this file: " << f_name << std::endl;
std::cout << "Programm terminating";
exit(EXIT_FAILURE);
}
u_txt2.get(ch);
while (!(ch == EOF))
{
std::cout << ch;
u_txt2.get(ch);
}
u_txt2.close();
return 0;
};
Ответы (2 шт):
Метод std::ifstream(char_type & ch)
пытается получить один символ, и сохраняет его, если его удалось прочитать из файла.
В противном случае, метод оставляет ch
без изменения и устанавливает failbit
и eofbit
биты.
Когда std::ifstream
доходит до конца файла, то EOF
не сохраняется в ch
. ch
остаётся прежним, поэтому цикл while (!(ch == EOF))
продолжается бесконечно.
Поменяйте его на:
while (u_txt2.get(ch).good())
{
std::cout << ch;
}
Метод good()
возвращает true
, если самая последняя операция ввода/вывода была завершена успешно. Соответственно, когда std::ifstream
обнаруживет конец файла, этот метод возращает false
, и цикл прерывается.
Может проще использовать построчное чтение?
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::fstream txtfile;
txtfile.open("exp.txt");
std::string line;
while (std::getline(txtfile, line))
{
std::cout << line << std::endl;
}
txtfile.close();
return 0;
}