Spec-Zone.ru › C++

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 - задаёт базовую позицию, относительно которой применяется смещение. Может принимать одну из следующих констант:
Константа Описание
beg начало потока
end конец потока
cur текущая позиция указателя позиции потока
which - задаёт, на какую из последовательностей ввода и/или вывода следует воздействовать. Может принимать одну или несколько из следующих констант:
Константа Описание
in воздействовать на последовательность ввода
out воздействовать на последовательность вывода

Возвращаемое значение

Вновь созданный объект типа 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))
возвращается в случае ошибки

См. также

pubseekoff
вызывает seekoff()
(открытая функция-член класса std::basic_streambuf<CharT,Traits>)
seekpos
[виртуальная]
перемещает позицию в файле, используя абсолютную адресацию
(виртуальная защищённая функция-член)
fseek
перемещает указатель позиции файла в заданное место файла
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_filebuf/seekoff

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API