std::basic_filebuf<CharT,Traits>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
Перемещает указатель файла, если возможно, в позицию, соответствующую точно off символам от начала, конца или текущей позиции файла (в зависимости от значения dir ).
Если связанный файл не открыт ( is_open ( ) == false ), завершается немедленно.
Если многобайтовая кодировка символов является зависимой от состояния (
codecvt::encoding()
возвращает
-
1
) или переменной длины (
codecvt::encoding()
возвращает
0
) и смещение
off
не равно
0
, функция немедленно завершается ошибкой: данная функция не может определить количество байтов, соответствующих
off
символам.
Если dir не равен std::basic_ios::cur или смещение off не равно 0 , и последней операцией, выполненной с этим объектом filebuf, был вывод (то есть либо буфер вывода не пуст, либо последней вызванной функцией была overflow() ), то вызывается std :: codecvt :: unshift для определения необходимой последовательности unshift, и эта последовательность записывается в файл путем вызова overflow() .
Затем преобразует аргумент dir в значение whence типа int следующим образом:
| значение dir | значение whence |
| std :: basic_ios :: beg | SEEK_SET |
| std :: basic_ios :: end | SEEK_END |
| std :: basic_ios :: cur | SEEK_CUR |
Затем, если кодировка символов имеет фиксированную ширину (
codecvt::encoding()
возвращает некоторое положительное число
width
), перемещает указатель файла как если бы с помощью
std::
fseek
(
file, width
*
off, whence
)
.
В противном случае, перемещает указатель файла как если бы с помощью std:: fseek ( file, 0 , whence ) .
Аргумент
openmode
, требуемый сигнатурой функции базового класса, обычно игнорируется, поскольку
std::basic_filebuf
поддерживает только одну позицию в файле.
Содержание |
Параметры
| off | - | относительная позиция для установки индикатора позиции | ||||||||
| dir | - |
определяет базовую позицию для применения относительного смещения. Может быть одной из следующих констант:
|
||||||||
| which | - |
определяет, на какую из входных и/или выходных последовательностей воздействовать. Может быть одной или комбинацией следующих констант:
|
Возвращаемое значение
Вновь созданный объект типа pos_type , который хранит результирующую позицию в файле, или pos_type ( off_type ( - 1 ) ) при неудаче.
Примечания
seekoff()
вызывается функцией
std
::
basic_streambuf
::
pubseekoff
, которая в свою очередь вызывается функциями
std
::
basic_istream
::
seekg
,
std
::
basic_ostream
::
seekp
,
std
::
basic_istream
::
tellg
и
std
::
basic_ostream
::
tellp
.
Пример
#include <fstream> #include <iostream> #include <locale> template<typename CharT> int get_encoding(const std::basic_istream<CharT>& stream) { using Facet = std::codecvt<CharT, char, std::mbstate_t>; return std::use_facet<Facet>(stream.getloc()).encoding(); } int main() { // подготовить 10-байтовый файл с 4 символами ("zß水𝄋") в UTF-8 std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; // открыть с использованием неконвертирующей кодировки std::ifstream f1("text.txt"); std::cout << "encoding() локали f1 возвращает " << get_encoding(f1) << '\n' << "pubseekoff(3, beg) возвращает " << f1.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n' << "pubseekoff(0, end) возвращает " << f1.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n'; // открыть с использованием UTF-8 std::wifstream f2("text.txt"); f2.imbue(std::locale("en_US.UTF-8")); std::cout << "encoding() локали f2 возвращает " << get_encoding(f2) << '\n' << "pubseekoff(3, beg) возвращает " << f2.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n' << "pubseekoff(0, end) возвращает " << f2.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n'; }
Вывод:
encoding() локали f1 возвращает 1 pubseekoff(3, beg) возвращает 3 pubseekoff(0, end) возвращает 10 encoding() локали f2 возвращает 0 pubseekoff(3, beg) возвращает -1 pubseekoff(0, end) возвращает 10
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 55 | C++98 |
seekoff
возвращал неопределённую
недопустимую позицию в потоке при ошибке |
pos_type
(
off_type
(
-
1
)
)
возвращается при ошибке |
Смотрите также
|
вызывает
seekoff
(
)
(публичная функция-член
std::basic_streambuf<CharT,Traits>
)
|
|
|
[virtual]
|
перемещает позицию в файле, используя абсолютную адресацию
(виртуальная защищенная функция-член) |
|
перемещает указатель позиции файла в определенное место в файле
(функция) |