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++.

DR Применено к Поведение как опубликовано Правильное поведение
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/w/cpp/io/basic_filebuf/seekoff

Spec-Zone.ru

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