c++ - fstream и ofstream

Каква е разликата между:

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 по подразбиране е отворен режим 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 поддържа само изходни операции (т.е. текстов файл ‹‹ "здравей"), докато fstream поддържа както изходни, така и входни операции, но в зависимост от флаговете, дадени при отваряне на файла. Във вашия пример отвореният режим е ios_base::in | ios_base::out по подразбиране. Стандартният отворен режим на ofstream е ios_base::out. Освен това, ios_base::out винаги е зададено за ofstream обекти (дори ако изрично не е зададено в режим аргумент).

Използвайте ofstream, когато textfile е само за изход, ifstream само за вход, fstream както за вход, така и за изход. Това прави намерението ви по-ясно.

person Danqi Wang    schedule 24.04.2014
comment
y ! вместо това цитирайте 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