Seekg c что это

от admin

Seekg c что это

На этом шаге мы рассмотрим средства произвольного доступа к файлам .

В таблице 1 перечислены функции позиционирования в потоках данных C++ .

Таблица 1. Функции позиционирования в потоках данных
Класс Функция Описание
basic_istream<> tellg() Возвращает текущую позицию чтения
seekg(pos) Устанавливает абсолютную позицию чтения
seekg(offset, rpos) Устанавливает относительную позицию чтения
basic_ostream<> tellp() Возвращает текущую позицию записи
seekp(pos) Устанавливает абсолютную позицию записи
seekp(offset, rpos) Устанавливает относительную позицию записи

Позиционирование чтения и записи выполняется отдельными функциями (суффикс «g» означает «get» , а суффикс «р» — «put» ). Функции чтения определяются в классе basic_istream , а функции записи — в классе basic_ostream . Тем не менее не все потоковые классы поддерживают позиционирование. Например, для потоков данных cin, cout и cerr позиционирование не определено. Операции файлового позиционирования определяются в базовых классах, потому что обычно используются ссылки на объекты типов istream и ostream .

Функции seekg() и seekp() могут вызываться для абсолютных или относительных позиций. Функции tellg() и tellp() возвращают абсолютную позицию в виде значения типа pos_type . Это значение не является целым числом или индексом, задающим позицию символа, поскольку логическая позиция может отличаться от фактической. Например, в текстовых файлах MS-DOS символы новой строки хранятся в файлах в виде двух символов, хотя логически они соответствуют только одному символу. Кроме того, ситуация дополнительно усложняется при многобайтовой кодировке символов.

Разобраться в точном определении типа pos_type непросто: стандартная библиотека C++ определяет глобальный класс шаблона fpos<> для представления позиций в файлах. На базе класса fpos<> определяются типы streampos (для потоков данных char ) и wstreampos (для потоков даииых wchar_t ). Эти типы используются для определения pos_type соответствующих классов трактовок. Наконец, переменная типа pos_type класса трактовок требуется для определения типа pos_type соответствующих потоковых классов. Следовательно, позиции в потоке данных также могут представляться типом streampos , ио использовать типы long и unsigned long было бы неправильно, потому что streampos не является целочисленным типом (а точнее, перестал им быть). Пример:

Следующие объявления эквивалентны:

В версиях с относительным позиционированием смещение задается по отношению к трем позициям, для которых определены соответствующие константы (таблица 2). Константы определяются в классе ios_base и относятся к типу seekdir .

Таблица 2. Константы относительных позиций
Константа Описание
beg Смещение задается относительно начала файла
cur Смещение задается относительно текущей позиции
end Смещение задается относительно конца файла

Смещение относится к типу off_type , который представляет собой косвенное определение для streamoff . По аналогии с pos_type тип streamoff используется для определения off_type в классе трактовок и в потоковых классах. Тем не менее streamoff является целым знаковым типом, поэтому смещение в потоке данных может задаваться целым числом. Пример:

При позиционировании необходимо всегда следить за тем, чтобы позиция оставалась внутри файла. Позиционирование перед началом или после конца файла приводит к непредсказуемым последствиям.

Следующий пример демонстрирует использование функции seekg() . В ием определена функция, которая дважды выводит содержимое файла:

Результат работы программы выглядит так:

Рис.1. Результат работы приложения

Обратите внимание на вывод содержимого файла функцией file.rdbuf() . Операция выполняется прямо с потоковым буфером и не изменяет состояния потока данных. Если содержимое file выводится фуикциями потокового интерфейса, такими как getline() (смотри 479 шаг), вам придется сбросить состояние файла file функцией clear() перед тем, как выполнять с ним любые операции, включая изменение позиции чтения, поскольку эти функции устанавливают флаги ios::eofbit и ios::failbit при достижении конца файла.

Управление позициями чтения и записи осуществляется разными функциями, но для стандартных потоков данных поддерживается общая позиция чтения/записи в одном потоковом буфере. Это важно, если буфер используется несколькими потоками данных.

Seekg c что это

seekg() is a function in the iostream library that allows you to seek an arbitrary position in a file. It is included in the <fstream> header file and is defined for istream class. It is used in file handling to sets the position of the next character to be extracted from the input stream from a given file.

Syntax: There are two syntaxes for seekg() in file handling,

Parameters:

  • position: is the new position in the stream buffer.
  • offset: is an integer value of type streamoff representing the offset in the stream’s buffer. It is relative to the dir parameter.
  • dir: It is the seeking direction. It is an object of type ios_base::seekdir that can take any of the following constant values.

There are 3 directions we use for offset value:

  • ios_base::beg: offset from the beginning of the stream’s buffer.
  • ios_base::cur: offset from the current position in the stream’s buffer.
  • ios_base::end: offset from the end of the stream’s buffer.

Let’s understand through an example,

Читать:
Kvrt 2020 что это

If we take the following input,

and seek to 6th position from the beginning of the file

and read the next 5 characters from the file into a buffer,

then the output will be,

Algorithm for the Above Example:

  • Open a new file for input/output operations, discarding any current in the file (assume a length of zero on opening).
  • Add the characters “Hello World” to the file.
  • Seek to 6 characters from the beginning of the file.
  • Read the next 5 characters from the file into the buffer.
  • End the buffer with a null terminating character.
  • Output the contents read from the file and close it.

Program:

Output:

Note: If we previously get an end of file on the stream, seekg will not reset it but will return an error in many implementations. Use the clear() method to clear the end of file bit first. This is a relatively common mistake and if seekg() is not performing as expected.

std:: istream::seekg

Sets the position of the next character to be extracted from the input stream.

Internally, the function accesses the input sequence by first constructing a sentry object (with noskipws set to true ). Then (if good ), it calls either pubseekpos (1) or pubseekoff (2) on its associated stream buffer object (if any). Finally, it destroys the sentry object before returning.

Parameters

pos New absolute position within the stream (relative to the beginning).
streampos is an fpos type (it can be converted to/from integral types).
off Offset value, relative to the way parameter.
streamoff is an offset type (generally, a signed integral type).
way Object of type ios_base::seekdir . It may take any of the following constant values:

value offset is relative to.
ios_base::beg beginning of the stream
ios_base::cur current position in the stream
ios_base::end end of the stream

Return Value

The istream object ( *this ).

Errors are signaled by modifying the internal state flags:

flag error
eofbit
failbit Either the construction of sentry failed, or the internal call to pubseekpos (1) or pubseekoff (2) failed (i.e., either function returned -1 ).
badbit Another error occurred on the stream (such as when the function catches an exception thrown by an internal operation).
When set, the integrity of the stream may have been affected.

Multiple flags may be set by a single operation.

If the operation sets an internal state flag that was registered with member exceptions , the function throws an exception of member type failure .

Урок №213. Рандомный файловый ввод и вывод

На этом уроке мы рассмотрим реализацию рандомного файлового ввода/вывода в языке С++.

Файловый указатель

Каждый класс файлового ввода/вывода содержит файловый указатель, который используется для отслеживания текущей позиции чтения/записи данных в файле. Любая запись в файл или чтение содержимого файла происходит в текущем местоположении файлового указателя. По умолчанию, при открытии файла для чтения или записи, файловый указатель находится в самом начале этого файла. Однако, если файл открывается в режиме добавления, то файловый указатель перемещается в конец файла, чтобы пользователь имел возможность добавить данные в файл, а не перезаписать его.

Рандомный доступ к файлам с помощью функций seekg() и seekp()

До этого момента мы осуществляли последовательный доступ к файлам, т.е. выполняли чтение/запись файла по порядку. Тем не менее, мы можем выполнить и произвольный (рандомный) доступ к файлу (т.е. перемещаться по файлу, как захотим). Это может быть полезно, когда файл имеет обширное содержимое, а нам нужна всего лишь небольшая конкретная запись из всего этого. Вместо последовательного доступа (когда мы переходим до нужной записи начиная с самого начала файла), мы можем осуществить непосредственный доступ к этой записи.

Рандомный доступ к файлу осуществляется путем манипулирования файловым указателем с помощью функции seekg() (окончание «g« = «get», т.е. «получить/достать») — для ввода, и функции seekp() (окончание «p« = «put» (т.е. «положить/поместить») — для вывода.

Функции seekg() и seekp() принимают следующие два параметра:

первый параметр — это смещение на которое следует переместить файловый указатель (измеряется в байтах);

второй параметр — это флаг ios, который обозначает место, от которого следует отталкиваться при выполнении смещения.

Флаги ios, которые принимают функции seekg() и seekp() в качестве второго параметра:

beg — cмещение относительно начала файла (по умолчанию);

cur — cмещение относительно текущего местоположения файлового указателя;

end — смещение относительно конца файла.

Положительное смещение означает перемещение файлового указателя в сторону конца файла, тогда как отрицательное смещение означает перемещение файлового указателя в сторону начала файла. Например:

Related Posts