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

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

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

совпадает с

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

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

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

4 голоса | спросил Mohamed Ahmed Nabil 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 09 Sep 2012 01:41:48 +0400 2012, 01:41:48

1 ответ


0

basic_fstream является производным от basic_iostream который получен из basic_istream и basic_ostream. Итак, basic_fstream имеет функцию seekp из ---- +: = 6 =: + ---- и функция basic_ostream из seekg

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

basic_filebuf

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

Где basic_ostream<charT,traits>& seekp(pos_type pos); вызывает pubseekpos ( это seekpos, поэтому вызывает virtual )

basic_filebuf::seekpos

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

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

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

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

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

Поскольку вы открываете файл с помощью функции pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out); , выполняйте 2 и 3 пункт.

ios_base::in

Эффекты: ведет себя как неотформатированная функция ввода (как описано в пункте 27.7.2.3, параграф 1), за исключением того, что функция сначала очищает eofbit, она не считает количество извлеченных символов и не влияет на значение, возвращаемое последующими вызовами gcount (). После построения часового объекта, если не удалось () ! = true, выполняет rdbuf () -> pubseekpos (pos, ios_base :: in). В случае сбоя функция вызывает setstate (failbit) (который может выдать ios_base :: fail).
ответил ForEveR 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSun, 09 Sep 2012 02:05:59 +0400 2012, 02:05:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132