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
[виртуальная]
перемещает позицию в файле с использованием относительной адресации
(виртуальная защищённая функция-член)
fseek
перемещает индикатор позиции файла в указанное место файла
(функция)

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

Spec-Zone.ru

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