istream
и ostream
обычно не обеспечивают произвольного доступа, в остальной части этого раздела речь идет только о классах fstream
и sstream
.
Для обеспечения произвольного доступа типы ввода-вывода обладают g
(getting) означает получение данных (чтение), а суффикс p
(putting) — помещение данных (запись).
Таблица 17.21. Функции установки и сообщения
tellg() tellp() | Возвращает текущую позицию маркера потока ввода (tellg() ) или потока вывода (tellp() ) |
seekg(pos) seekp(pos) | Переустанавливает маркер потока ввода или вывода на заданный параметром pos абсолютный адрес в потоке. Значение pos обычно возвращается предыдущим вызовом в соответствующей функции tellg() или tellp() |
seekp(off, from) seekg(off, from) | Переустанавливает маркер потока ввода или вывода на off символов вперед или назад от значения from , которое может быть: |
beg — от начала потока; | |
cur — от текущей позиции потока; | |
end — от конца потока |
Вполне логично, что для класса istream
, а также производных от него классов ifstream
и istringstream
(см. раздел 8.1) можно использовать только версии g
, а для классов ostream
и классов ofstream
и ostringstream
, производных от него, можно использовать только версии p
. Классы iostream
, fstream
и stringstream
способны читать и записывать данные в поток, поэтому для них можно использовать обе версии, g
и p
.
Тот факт, что библиотека различает версии функций seek()
и tell()
для чтения и записи, может ввести в заблуждение. Хотя библиотека и различает эти функции, в файле существует только один маркер, т.е. нет разных маркеров для чтения и записи.
Когда речь идет о потоке только ввода или вывода, различие не столь очевидно. В таких потоках можно использовать версии только g
или p
. Если попытаться вызвать функцию tellp()
для объекта класса ifstream
, компилятор сообщит об ошибке. Аналогично он поступит при попытке вызвать функцию seekg()
для объекта класса ostringstream
.
Типы fstream
и stringstream
допускают чтение и запись в тот же поток. У них есть один буфер для хранения подлежащих чтению и записи данных, а также один маркер, обозначающий текущую позицию в буфере. Библиотечные функции версий g
и p
используют тот же маркер позиции.
seek()
.
Имеются две версии функции установки позиции: одна обеспечивает переход к указанной позиции в файле, а другая осуществляет смещение от текущей позиции.
//
seekg(new_position); //
seekp(new_position); //
//
seekg(offset, from); //
seekp(offset, from); //
Возможные значения параметра from
перечислены в табл. 17.21.
Аргументы new_position
и offset
этих функций имеют машинно-зависимые типы pos_type
и off_type
соответственно. Они определены в классах istream
и ostream
. Тип pos_type
представляет позицию файла, а тип off_type
— смещение от этой позиции. Значение типа off_type
может быть положительным или отрицательным, что соответствует смещению вперед или назад.