Взаимодействие между ios :: app и fstream, используемым для ввода

При отладке чужого кода я натолкнулся на взаимодействие между 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

0

Решение

Если вы проверите std::fstream конструктор вы заметите, что аргумент по умолчанию является битовым полем флагов ios_base::in а также ios_base::out, Поставляя только ios_base::app в качестве флага вы делаете файл только для добавления. Если ты хочешь и то и другое введите и добавьте, тогда вы должны использовать, например, ios::in | ios::app,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]