Прямой доступ при работе с файлами

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

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

Замечание.Рассматриваемые далее методы ориентированы на использование в двоичном режиме работы с файлами. В текстовом режиме позиционирование указателей может оказаться не точным.

Перемещение указателей в потоках осуществляется с помощью соответствующих потоковых функций:

· ifstream &seekg ( off_type offset, seekdir way ); - перемещение get-указателя;

· ofstream &seekp ( off_type offset, seekdir way ); - перемещение put-указателя.

Перемещение соответствующего указателя осуществляется на offset байт (тип данных off_type– целочисленный тип данных, может принимать отрицательные и положительные значения) относительно точки, задаваемой параметром way.

Тип данных seekdirпараметра way имеет три возможных значения:

· ios :: beg – начало файла;

· ios :: cur – текущая позиция;

· ios :: end – конец файла.

Существуют перегруженные функции позиционирования указателей, обеспечивающие абсолютную адресацию указателя в заданную позицию файла:

· ifstream & seekg ( pos_type pos ); - перемещение get-указателя в позицию pos;

· ofstream & seekp ( pos_type pos ); - перемещение put-указателя в позицию pos.

Тип данных pos_typeявляется целочисленным беззнаковым типом. Позиция 0 соответствует началу файла.

Определить текущие позиции указателей можно с помощью следующих потоковых функций:

pos_type tellg (); - возвращает текущую позицию get-указателя;

pos_type tellp (); - возвращает текущую позицию put-указателя;

В качестве иллюстрации напишем функцию, возвращающую размер в байтах заданного файла:

 

unsigned FileSize ( char *FileName)

{

ifstream File ( FileName, ios::in | ios::binary );

if ( !File ) // Проверили удалось ли открыть файл

{

cout << "Файл не найден! \n" ;

Return 0;

}

File.seekg (0, ios::end );

unsigned Size = File.tellg();

File.close ();

Return Size;

}








Дата добавления: 2019-02-07; просмотров: 947;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.