искать и искать с Fstream

Я заметил эту странную вещь

fstream obj(filename , ios::in);
obj.seekp(7);

такой же как

fstream obj(filename , ios::in);
obj.seekg(7);

seekg а также seekp сделать то же самое и вызвать тот же результат, хотя я указал только флаг ios :: in

Почему они оба работают с fstream? И в чем разница между seekp а также seekg с фстримом?

4

Решение

basic_fstream происходит от basic_iostream который получен из basic_istream а также basic_ostream, Так, basic_fstream имеет функцию seekp от basic_ostream и функция seekg от basic_ifstream,

Короче говоря, в вашем случае вызовы seekp и seekg совершают одни и те же действия, поскольку действия выполняются basic_filebuf::seekpos зависит только от открытого режима для basic_filebuf,

basic_ostream<charT,traits>& seekp(pos_type pos);


Эффекты: Если fail ()! = True, выполняет rdbuf () -> pubseekpos (pos, ios_base :: out). В случае неудачи,
функция вызывает setstate (failbit) (который может выдать ios_base :: fail).

куда pubseekpos звонки seekpos (который virtualИтак, звонки basic_filebuf::seekpos)

pos_type seekpos(pos_type sp,
ios_base::openmode which = ios_base::in | ios_base::out);


Изменяет положение файла, если это возможно, в соответствии с положением, сохраненным в sp (как описано ниже).
Изменение позиции файла выполняется следующим образом:

  1. если (ом & ios_base :: out)! = 0, затем обновите выходную последовательность и запишите любую последовательность unshift;

  2. установите положение файла в sp;

3. если (ом & ios_base :: in)! = 0, затем обновите последовательность ввода;

где om — режим открытия, переданный последнему вызову open (). Операция не выполняется, если is_open () возвращает
ложный.

Так как вы открываете файл с ios_base::in Функция выполняет 2 и 3 пункта.

basic_istream<charT,traits>& seekg(pos_type pos);


Эффекты: ведет себя как неотформатированная функция ввода (как описано в пункте 27.7.2.3, параграф 1), за исключением того, что
функция сначала очищает eofbit, она не считает количество извлеченных символов и не
влияет на значение, возвращаемое последующими вызовами gcount (). После построения часового объекта, если не удалось ()
! = true, выполняет rdbuf () -> pubseekpos (pos, ios_base :: in). В случае сбоя функция вызывает
setstate (failbit) (который может выдать ios_base :: fail).

5

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

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

По вопросам рекламы ammmcru@yandex.ru