Seekg c что это

Seekg c что это

Функция является членом класса istream

В системе ввода-вывода C++ с помощью функций seekg() и seekp() выполняется произвольный доступ, т.е. система ввода-вывода C++ управляет двумя указателями, связанными с файлом. Один из них — это указатель ввода(get pointer), который указывает, в каком месте файла будет выполняться следующая операция ввода. А другой — указатель вывода(put pointer), который указывает, в каком месте файла будет выполняться следующая операция вывода. При каждом выполнении операции ввода или вывода соответствующий указатель автоматически перемещается, последовательно изменяя свою позицию. Однако, используя функции seekg() и seekp(), можно получить доступ к файлу непоследовательным образом.

Версия функции seekg() с двумя параметрами перемещает указатель ввода на offset байт от позиции, заданной параметром origin. Параметр offset имеет тип off_type. Объект типа off_type способен содержать самое большое допустимое значение, которое может иметь параметр offset.

Параметр origin имеет тип seek_dir и представляет собой перечисление, которое имеет следующие значения.

ios::begСмещение от начала
ios::curСмещение от текущей позиции
ios::endСмещение от конца

Версия функции seekg() с одним параметром перемещают указатели файлов в позиции, заданные параметром position. Это значение должно быть предварительно получено путем обращения либо к функции tellg(), либо к функции tellp() соответственно. Тип pos_type позволяет содержать самое большое допустимое значение, которое может иметь параметр position. Эта функция возвращают ссылку на соответствующий поток.

Источник

23.7 – Произвольный файловый ввод/вывод

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

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

Произвольный доступ к файлам с помощью seekg() и seekp()

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

Произвольный доступ к файлу осуществляется путем манипулирования файловым указателем с помощью функции seekg() (для ввода) и функции seekp() (для вывода). Если вам интересно, g означает «get» (получить), а p – «put» (положить). Для некоторых типов потоков seekg() (изменение позиции чтения) и seekp() (изменение позиции записи) работают независимо, однако с файловыми потоками позиции чтения и записи всегда идентичны, поэтому seekg и seekp могут использоваться взаимозаменяемо.

Флаг поиска iosЗначение
begСмещение относительно начала файла (по умолчанию)
curСмещение относительно текущего местоположения файлового указателя
endСмещение относительно конца файла

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

Вот несколько примеров:

Перейти к началу или концу файла очень просто:

Давайте рассмотрим пример, используя seekg() и входной файл, который мы создали в прошлом уроке. Этот входной файл выглядит так:

Этот код дает следующий результат:

Примечание. Некоторые компиляторы содержат ошибки в реализации seekg() и seekp() при использовании вместе с текстовыми файлами (из-за буферизации). Если ваш компилятор является одним из них (о чем вы узнаете, если ваш вывод будет отличаться от приведенного выше), вы можете вместо этого попробовать открыть файл в двоичном режиме:

Это длина файла sample.dat в байтах (при условии возврата каретки после последней строки).

Одновременные чтение и запись файла с помощью fstream

Класс fstream может читать и записывать файл одновременно (почти)! Самое большое неудобство здесь в том, что невозможно переключаться между чтением и записью произвольно. После чтения или записи единственный способ переключиться между ними – выполнить операцию, изменяющую позицию файла. Если вы на самом деле не хотите перемещать файловый указатель (потому что он уже находится в нужном вам месте), вы всегда можете перейти к текущей позиции:

Если вы этого не сделаете, может произойти множество странных и причудливых вещей.

Примечание: хотя может показаться, что iofile.seekg(0, ios::cur) также будет работать, похоже, что некоторые компиляторы могут оптимизировать этот вызов.

Другие полезные функции работы с файлами

Предупреждение о записи указателей на диск

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

Источник

Функции-члены потока выходного файла

Функции-члены потока вывода делятся на три типа: эквивалентные манипуляторам, выполняющие неформатированные операции записи и изменяющие состояние потока другим образом и при этом не имеющие эквивалентных манипуляторов или операторов вставки. Для последовательного форматированного вывода можно использовать только операторы вставки и манипуляторы. Для двоичного дискового вывода с произвольным доступом следует использовать другие функции-члены с операторами вставки или без них.

Функция open для потоков вывода

Чтобы использовать выходной поток файлов ( ofstream ), необходимо связать этот поток с конкретным дисковым файлом в конструкторе или open функции. При использовании open функции можно повторно использовать один и тот же объект потока с серией файлов. В любом случае аргументы, описывающие файл, одни и те же.

При открытии файла, связанного с выходным потоком, обычно указывается open_mode флаг. Эти флаги, которые определены как перечислители в классе, можно объединять ios с помощью оператора побитового или ( | ). ios_base::openmode Список перечислителей см. в разделе.

Три типовые ситуации для потока вывода используют параметры режима:

Создание файла. Если файл уже существует, старая версия удаляется.

Добавление записей к существующему файлу или создание нового, если он не существует.

Открытие двух файлов в одном и том же потоке, по одному за раз.

put Функция записывает один символ в выходной поток. Следующие две конструкции по умолчанию одинаковы, но вторая зависит от аргументов формата потока:

write Функция записывает блок памяти в поток выходных файлов. Аргумент length указывает количество записанных байт. Следующий пример создает файловый поток вывода и записывает в него двоичное значение структуры Date :

write Функция не останавливается при достижении символа null, поэтому записывается полная структура класса. Функция имеет два аргумента: указатель char и количество символов для записи. Обратите внимание на обязательное приведение до char * адреса объекта структуры.

Функции seekp и tellp

Функция close для потоков вывода

close Функция члена закрывает файл диска, связанный с выходным потоком файлов. Для завершения всех операций вывода на диск файл должен быть закрыт. При необходимости ofstream деструктор закрывает файл, но функцию можно использовать, close Если необходимо открыть другой файл для того же объекта потока.

Деструктор потока вывода автоматически закрывает файл потока только в том случае, если этот файл открыт конструктором или open функцией-членом. Если конструктору передается дескриптор файла для уже открытого файла или используется attach функция-член, необходимо закрыть файл явным образом.

Функции обработки ошибок

Используйте эти функции-члены для проверки на ошибки при записи в поток:

Оператор ! перегружен для выполнения той же функции, что и функция. Таким образом выражение:

void*() Оператор перегружается как противоположный ! оператору; таким образом, выражение:

void*() Оператор не эквивалентен, good так как не проверяет конец файла.

Источник

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

Обновл. 15 Сен 2021 |

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Функции-члены потока ввода

Функции — члены потока ввода используются для дисковых операций ввода.

Если используется входной поток файлов ( ifstream ), необходимо связать этот поток с конкретным файлом диска. Это можно сделать в конструкторе или можно использовать open функцию. В любом случае аргументы одни и те же.

Чтобы прочитать файл, сначала используйте функцию- fail член, чтобы определить, существует ли она:

Неформатированная get функция элемента работает как >> оператор с двумя исключениями. Во-первых, get функция включает пробелы, в то время как средство извлечения исключает пробелы при skipws установке флага (по умолчанию). Во-вторых, эта get функция менее вероятно приведет к тому, что связанный поток вывода ( cout например,) будет сброшен.

Вариант get функции указывает адрес буфера и максимальное число считываемых символов. Это полезно для ограничения количества символов, отправленных в конкретную переменную, как показано в примере:

Входные данные

Пример выходных данных

getline

getline Функция-член аналогична get функции. Обе функции допускают третий аргумент, который указывает завершающий символ для входных данных. Значение по умолчанию — символ новой строки. Обе функции резервируют один символ для необходимого завершающего символа. Однако get оставляет завершающий символ в потоке и getline удаляет завершающий символ.

В следующем примере задается завершающий символ для потока ввода:

Входные данные

чтение

Этот пример считывает двоичную запись из файла заработной платы в структуру:

Программа предполагает, что записи данных форматируются точно так же, как указано в структуре, без завершающего возврата каретки или символов перевода строки.

функции seekg и tellg

Чтобы использовать seekg для реализации систем управления данными, ориентированных на записи, умножьте размер записи фиксированной длины на номер записи, чтобы получить координату байта относительно конца файла, а затем используйте get объект для чтения записи.

close

close Функция члена закрывает файл диска, связанный с входным файлом потока, и освобождает файл операционной системы. ifstream Деструктор закрывает файл, но функцию можно использовать, close Если необходимо открыть другой файл для того же объекта потока.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *