std::basic_stringbuf<CharT,Traits,Allocator>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
Перемещает std::basic_streambuf::gptr и/или std::basic_streambuf::pptr , если возможно, в позицию, соответствующую ровно off символам от начала, конца или текущей позиции области чтения и/или записи буфера.
- Если which включает std::ios_base::in и этот буфер открыт для чтения (то есть, если ( which & std:: ios_base :: in ) == std:: ios_base :: in ), то перемещает указатель чтения std::basic_streambuf::gptr внутри области получения, как описано ниже
- Если which включает std::ios_base::out и этот буфер открыт для записи (то есть, ( which & std:: ios_base :: out ) == std:: ios_base :: out ), то перемещает указатель записи std::basic_streambuf::pptr внутри области помещения, как описано ниже
- Если which включает и std::ios_base::in и std::ios_base::out и буфер открыт и для чтения, и для записи (то есть, ( which & ( std:: ios_base :: in | std:: ios_base :: out ) ) == ( std:: ios_base :: in | std:: ios_base :: out ) ), и dir является либо std::ios_base::beg либо std::ios_base::end , то перемещает оба указателя - чтения и записи, как описано ниже.
- В противном случае эта функция завершается неудачей.
Если gptr и/или pptr перепозиционируются, это выполняется следующим образом:
off_type
определяется
Содержание |
Параметры
| off | - | относительная позиция для установки следующего указателя(ей) | ||||||||
| dir | - |
определяет базовую позицию для применения относительного смещения. Может быть одной из следующих констант:
|
||||||||
| which | - |
определяет, влияет ли на входную последовательность, выходную последовательность или на обе. Может быть одной или комбинацией следующих констант:
|
Возвращаемое значение
pos_type
(
newoff
)
при успехе,
pos_type
(
off_type
(
-
1
)
)
при неудаче или если
pos_type
не может представить результирующую позицию в потоке.
Пример
#include <iostream> #include <sstream> int main() { std::stringstream ss("123"); // ввод/вывод std::cout << "позиция записи = " << ss.tellp() << " позиция чтения = " << ss.tellg() << '\n'; // абсолютное позиционирование обоих указателей ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // переместить оба на 1 вперед std::cout << "позиция записи = " << ss.tellp() << " позиция чтения = " << ss.tellg() << '\n'; // попытка переместить оба указателя на 1 вперед от текущей позиции if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur)) std::cout << "перемещение обоих указателей из текущей позиции не удалось\n"; std::cout << "позиция записи = " << ss.tellp() << " позиция чтения = " << ss.tellg() << '\n'; // переместить указатель записи на 1 вперед, но не указатель чтения // также может быть вызвано как ss.seekp(1, std::ios_base::cur); ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out); std::cout << "позиция записи = " << ss.tellp() << " позиция чтения = " << ss.tellg() << '\n'; ss << 'a'; // запись в позиции записи std::cout << "Записано 'a' в позиции записи, буфер теперь " << ss.str() << '\n'; char ch; ss >> ch; std::cout << "чтение в позиции чтения дает '" << ch << "'\n"; }
Вывод:
позиция записи = 0 позиция чтения = 0 позиция записи = 1 позиция чтения = 1 перемещение обоих указателей из текущей позиции не удалось позиция записи = 1 позиция чтения = 1 позиция записи = 2 позиция чтения = 1 Записано 'a' в позиции записи, буфер теперь 12a чтение в позиции чтения дает '2'
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 55 | C++98 |
seekoff
возвращал неопределённую
недопустимую позицию в потоке при ошибке |
pos_type
(
off_type
(
-
1
)
)
возвращается при ошибке |
| LWG 375 | C++98 |
статические константные члены
std::ios_base
были
ошибочно указаны как члены std::basic_ios |
исправлено |
| LWG 432 | C++98 |
seekoff
мог завершиться успешно, даже если
newoff
+
off
указывал бы за последний инициализированный символ |
seekoff
завершается ошибкой
в этом случае |
| LWG 453 | C++98 |
репозиционирование нулевого
gptr
(
)
и/или нулевого
pptr
(
)
с новым смещением ноль всегда завершалось ошибкой |
может завершиться успешно в этом случае |
| LWG 563 | C++98 |
конечный указатель не мог быть использован для вычисления
newoff
потому что он не мог
быть точно контролируем программой после разрешения LWG issue 432 |
использовать указатель верхней границы
вместо этого |
Смотрите также
|
вызывает
seekoff
(
)
(публичная функция-член
std::basic_streambuf<CharT,Traits>
)
|
|
|
[virtual]
|
перепозиционирует следующий указатель во входной последовательности, выходной последовательности или в обеих, используя абсолютную адресацию
(виртуальная защищенная функция-член) |
|
[virtual]
|
перепозиционирует позицию в файле, используя относительную адресацию
(виртуальная защищенная функция-член
std::basic_filebuf<CharT,Traits>
)
|
|
[virtual]
|
перепозиционирует следующий указатель во входной последовательности, выходной последовательности или в обеих, используя относительную адресацию
(виртуальная защищенная функция-член
std::strstreambuf
)
|