Прямой доступ при работе с файлами
Во всех предыдущих примерах чтение и запись данных в файлы осуществлялась последовательно. Однако существуют методы, обеспечивающие возможность произвольного доступа к любому байту файла для осуществления записи или чтения данных именно в эту точку файла.
Поддержка этих методов основана на понятии указателя позиции в файле (или просто – указателя). В языке 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; просмотров: 1027;