Namespaces
Variants

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

From cppreference.net
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 ), завершается неудачей немедленно.

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

1) Если файл открыт для записи, записывает область вывода и любые последовательности unshift, требуемые текущей локализацией, используя 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() .

Многие реализации не обновляют область get в 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 последовательность операций репозиционирования была неясной прояснена

Смотрите также

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