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

Do

{

File.read (Buf, sizeof (Buf)); // Читаем данные из файла в буфер

cout.write (Buf, File.gcount ()); // Выводим содержимое буфера на экран

}

while (File);

cout << endl;

File.close ();

}

Функция FileToScr () обеспечивает чтение любого указанного файла в двоичном режиме и вывод его на экран в символьном виде с использованием функций блочного чтения и записи. Этот пример показывает, что функции блочного чтения и записи применимы и к стандартным потокам cin и cout (впрочем, как и функции get () и put ()). Ключевым моментом здесь является использование функции потока ввода gcount (). С помощью этой функции удается точно определить количество символов, которое необходимо вывести на экран из буфера после очередной операции чтения из файла.

Как обнаружить конец файла?

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

Обнаружить конец файла при чтении данных позволяет функция потока:

bool eof ();

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

Другой способ определения конца файла основан на том, что функции чтения данных из файла (get (), read ()) при достижении конца файла возвращают нулевую ссылку на поток. Этот способ иллюстрируется в последнем примере.

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

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

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

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

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

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

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

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

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

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

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

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

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

· ofsnteam & 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;

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: