Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: seekoff

From cppreference.net
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 для определения необходимой последовательности 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()
{
    // подготовить 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]
перемещает позицию в файле, используя абсолютную адресацию
(виртуальная защищенная функция-член)
перемещает указатель позиции файла в определенное место в файле
(функция)