Я заметил эту странную вещь
fstream obj(filename , ios::in);
obj.seekp(7);
такой же как
fstream obj(filename , ios::in);
obj.seekg(7);
seekg
а также seekp
сделать то же самое и вызвать тот же результат, хотя я указал только флаг ios :: in
Почему они оба работают с fstream? И в чем разница между seekp
а также seekg
с фстримом?
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 (как описано ниже).
Изменение позиции файла выполняется следующим образом:
если (ом & ios_base :: out)! = 0, затем обновите выходную последовательность и запишите любую последовательность unshift;
установите положение файла в 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).
Других решений пока нет …