Spec-Zone.ru › C++

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

protected:
virtual pos_type seekpos( pos_type sp,
                          std::ios_base::openmode which = std::ios_base::in | std::ios_base::out );

Перемещает указатель файла, если возможно, в позицию, указанную значением sp. Если связанный файл не открыт (is_open() == false), операция завершается немедленно.

Перемещение выполняется следующим образом:

1) Если файл открыт для записи, содержимое буфера вывода и любые необходимые последовательности преобразования, заданные текущим локальным языком, записываются с помощью overflow().
2) Указатель файла перемещается как при вызове std::fsetpos().
3) Если файл открыт для чтения, буфер ввода обновляется при необходимости.

Если значение sp не было получено путем вызова seekoff() или seekpos() для того же файла, поведение не определено.

Параметры

sp - позиция в файле, полученная путем вызова seekoff() или seekpos() ранее для того же файла
which - определяет, какие входные и/или выходные последовательности будут затронуты. Может быть одним или комбинацией следующих констант:
Константа Описание
in воздействует на входную последовательность
out воздействует на выходную последовательность

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

sp при успехе или pos_type(off_type(-1)) при ошибке.

Примечания

seekpos() вызывается std::basic_streambuf::pubseekpos(), который вызывается одноаргументными версиями std::basic_istream::seekg() и std::basic_ostream::seekp().

Многие реализации не обновляют буфер ввода в seekpos(), делегируя это underflow(), который вызывается следующим sgetc().

Пример

В некоторых реализациях буфер ввода очищается seekpos(), и второй underflow() необходим для наблюдения эффектов.

#include <fstream>
#include <iostream>
 
struct mybuf : std::filebuf
{
    pos_type seekpos(pos_type sp, std::ios_base::openmode which)
    {
        std::cout << "Before seekpos(" << sp << "), size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";
 
        pos_type rc = std::filebuf::seekpos(sp, which);
 
        std::cout << "seekpos() returns " << rc << ".\nAfter the call, "
                  << "size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";
// uncomment if get area is emptied by seekpos()
//        std::filebuf::underflow();
//        std::cout << "after forced underflow(), size of the get area is "
//                  << egptr() - eback() << " with "
//                  << egptr() - gptr() << " read positions available.\n";
 
        return rc;
    }
};
 
int main()
{
    mybuf buf;
    buf.open("test.txt", std::ios_base::in);
    std::istream stream(&buf);
    stream.get(); // read one char to force underflow()
    stream.seekg(2);
}

Возможный вывод:

Before seekpos(2), size of the get area is 110 with 109 read positions available.
seekpos() returns 2.
After the call, size of the get area is 110 with 108 read positions available.

Отчеты об ошибках

Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Корректное поведение
LWG 55 C++98 seekpos возвращало неопределённую
некорректную позицию потока при ошибке
pos_type(off_type(-1))
возвращается при ошибке
LWG 171 C++98 последовательность операций перемещения не была ясна уточнена

См. также

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

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

Spec-Zone.ru

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