c++ - fstream и офстрим

В чем разница между:

fstream texfile;
textfile.open("Test.txt");

а также

ofstream textfile;
textfile.open("Test.txt");

Одинаковая ли их функция?


person Robin    schedule 24.04.2014    source источник


Ответы (2)


ofstream имеет только методы вывода, поэтому, например, если вы попробуете textfile >> whatever, он не скомпилируется. fstream можно использовать для ввода и вывода, хотя то, что будет работать, зависит от флагов, которые вы передаете конструктору / open.

std::string s;
std::ofstream ostream("file");
std::fstream stream("file", stream.out);

ostream >> s; // compiler error
stream >> s; // no compiler error, but operation will fail.

В комментариях есть еще несколько замечательных моментов.

person user657267    schedule 24.04.2014
comment
Кроме того, ofstream::open по умолчанию имеет значение openmode ios_base::out, а fstream::open по умолчанию имеет значение ios_base::in | ios_base::out. - person M.M; 24.04.2014
comment
Более того, в случае std::fstream попытка открыть файл завершится ошибкой, если файл не существует. Это отличается от std::ofstream, который создает файл, если его не удается найти. Нужно было бы добавить флаг std::ios_base::trunc в маску при вызове конструктора или open() в std::fstream. - person 0x499602D2; 24.04.2014

Взгляните на их страницы на cplusplus.com здесь и здесь.

ofstream наследуется от ostream. fstream наследуется от iostream, который наследуется как от istream, так и от stream. Обычно ofstream поддерживает только операции вывода (т. е. текстовый файл ‹‹ «hello»), а fstream поддерживает как операции вывода, так и операции ввода, но в зависимости от флагов, заданных при открытии файла. В вашем примере открытый режим по умолчанию ios_base::in | ios_base::out. Режим открытия ofstream по умолчанию — ios_base::out. Более того, для объектов ofstream всегда устанавливается ios_base::out (даже если явно не задано в режиме аргумента).

Используйте ofstream, когда textfile только для вывода, ifstream только для ввода, fstream и для ввода, и для вывода. Это делает ваше намерение более очевидным.

person Danqi Wang    schedule 24.04.2014
comment
у! вместо этого ссылайтесь на cppreference.com - person Cheers and hth. - Alf; 24.04.2014
comment
@Cheersandhth.-Alf cppreference.com красивее, но Google возвращает мне cplusplus.com для c++ fstream. Каковы другие преимущества cppreference.com по сравнению с cplusplus.com? - person Danqi Wang; 24.04.2014
comment
@DanqiWang: в целом более правильный из-за лучшей экспертной оценки - person Cheers and hth. - Alf; 24.04.2014