Несколько вопросов про std::fstream

Класс fstream наследуется от istream и ostream и ещё от других классов. В классе istream определён метод seekg, а в ostream - seekp. Так же и с функциями tellg и tellp.

  1. Правильно ли я понимаю, что нужно при записи использовать функции seekp и tellp, а при чтении из файла - seekg и tellg?
  2. Стоит ли объекту типа std::fstream при открытии передавать openmode (std::ios_base::in или std::ios_base::out) при чтении и записи соответственно и использовать соответствующие функции из классов istream при std::ios_base::in и наоборот?
  3. И почему, если у объекта типа std::fstream вызвать метод open() и передать в аргумент std::ios_base::in, метод seekp, унаследованный от класса ostream будет работать корректно, хотя мы указали, что мы собираемся читать из файла, а не выводить в него? Заранее спасибо.

Ответы (1 шт):

Автор решения: AR Hovsepyan

Класс 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 являются только "дедушка" с "бабушкой". Это маленькая поправка к вашей информации.

  1. Все верно, для записи используются одни, а для чтения другие функции_члены.

  2. Так как объект типа std::fstream умеет(имеет такое наследство) и записывать и читать, то по умолчанию он так и делает. Но если хотите, чтобы он только записывал или только читал, то нужно установить соответствующий режим, но тогда пропадает смысл его использования, а не использования прямого другого наследника istream и ostream, то есть std::ifstream и std::ofstream.

  3. От всего выше сказанного следует, что, если вы имеете объект std::fstream, а значит вы имеете объект с возможностью для чтения и записи из файла/в файл, а следовательно Вы можете с его помощью открыть файл в любом режиме. Но это не влияет на его функциональность, он как умел изменять положение выходного потока ( seekp) , так и будет уметь, но только установленный режим может не дасть записывать туда что то

→ Ссылка