Несколько вопросов про std::fstream
Класс fstream наследуется от istream и ostream и ещё от других классов. В классе istream определён метод seekg, а в ostream - seekp. Так же и с функциями tellg и tellp.
- Правильно ли я понимаю, что нужно при записи использовать функции
seekpиtellp, а при чтении из файла -seekgиtellg? - Стоит ли объекту типа
std::fstreamпри открытии передаватьopenmode(std::ios_base::inилиstd::ios_base::out) при чтении и записи соответственно и использовать соответствующие функции из классовistreamприstd::ios_base::inи наоборот? - И почему, если у объекта типа
std::fstreamвызвать методopen()и передать в аргументstd::ios_base::in, методseekp, унаследованный от классаostreamбудет работать корректно, хотя мы указали, что мы собираемся читать из файла, а не выводить в него? Заранее спасибо.
Ответы (1 шт):
Класс std::fstream это псевдоним класса std::basic_fstream<char, char_traits<char>>, который является наследником std::basic_iostream<char, char_traits<char>>, то есть std::iostream. А это значит, что для std::fstream "папа" std::iostream, а istream и ostream это родители последнего, а значит для std::fstream являются только "дедушка" с "бабушкой". Это маленькая поправка к вашей информации.
Все верно, для записи используются одни, а для чтения другие функции_члены.
Так как объект типа
std::fstreamумеет(имеет такое наследство) и записывать и читать, то по умолчанию он так и делает. Но если хотите, чтобы он только записывал или только читал, то нужно установить соответствующий режим, но тогда пропадает смысл его использования, а не использования прямого другого наследникаistreamиostream, то естьstd::ifstreamиstd::ofstream.От всего выше сказанного следует, что, если вы имеете объект std::fstream, а значит вы имеете объект с возможностью для чтения и записи из файла/в файл, а следовательно Вы можете с его помощью открыть файл в любом режиме. Но это не влияет на его функциональность, он как умел изменять положение выходного потока ( seekp) , так и будет уметь, но только установленный режим может не дасть записывать туда что то