std::basic_filebuf<CharT,Traits>::seekoff
protected:
virtual pos_type seekoff( off_type off,
std::ios_base::seekdir dir,
std::ios_base::openmode which = std::ios_base::in | std::ios_base::out );
|
По возможности перемещает файловый указатель в позицию, соответствующую ровно 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 для определения необходимой последовательности сдвига, после чего эта последовательность записывается в файл вызовом 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()
{
// prepare a 10-byte file holding 4 characters ("zß水𝄋") in UTF-8
std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
// open using a non-converting encoding
std::ifstream f1("text.txt");
std::cout << "f1's locale's encoding() returns "
<< get_encoding(f1) << '\n'
<< "pubseekoff(3, beg) returns "
<< f1.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
<< "pubseekoff(0, end) returns "
<< f1.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
// open using UTF-8
std::wifstream f2("text.txt");
f2.imbue(std::locale("en_US.UTF-8"));
std::cout << "f2's locale's encoding() returns "
<< get_encoding(f2) << '\n'
<< "pubseekoff(3, beg) returns "
<< f2.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
<< "pubseekoff(0, end) returns "
<< f2.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
}
Вывод:
f1's locale's encoding() returns 1 pubseekoff(3, beg) returns 3 pubseekoff(0, end) returns 10 f2's locale's encoding() returns 0 pubseekoff(3, beg) returns -1 pubseekoff(0, end) returns 10
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 55 | C++98 |
seekoff возвращал неопределённуюнедопустимую позицию потока в случае ошибки |
pos_type(off_type(-1))возвращается в случае ошибки |
См. также
вызывает seekoff() (открытая функция-член класса std::basic_streambuf<CharT,Traits>) |
|
|
[виртуальная] | перемещает позицию в файле, используя абсолютную адресацию (виртуальная защищённая функция-член) |
| перемещает указатель позиции файла в заданное место файла (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_filebuf/seekoff