При отладке чужого кода я натолкнулся на взаимодействие между C ++. fstream
объект, ввод через оператор потока и ios::app
о котором я раньше не знал.
Предполагать file.txt
существует и содержит текстовые данные. fstream
в его первоначальном контексте долгое время жил и служил как для ввода и вывода. Следующий код не работает должным образом (не выводит файл), код обработки ошибок был опущен:
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream f("file.txt", ios::app);
string in;
f >> in;
cout << in << endl;
f.close();
return 0;
}
Изменение оператора открытия файла на следующее решает проблему:
fstream f("file.txt");
Это ожидаемое поведение? Если не возможно открыть fstream
возражать с ios :: app и ожидать, что ввод через потоковые операторы будет вести себя правильно?
Скомпилировано с g ++ 4.6.3 на 64-битной Linux и mingw-g ++ 4.4.1 на 32-битной Windows 7
Если вы проверите std::fstream
конструктор вы заметите, что аргумент по умолчанию является битовым полем флагов ios_base::in
а также ios_base::out
, Поставляя только ios_base::app
в качестве флага вы делаете файл только для добавления. Если ты хочешь и то и другое введите и добавьте, тогда вы должны использовать, например, ios::in | ios::app
,
Других решений пока нет …