Выбрать главу

Функция seekg() перемещает текущий get-указатель соответствующего файла на offset байт относительно позиции, заданной параметром origin. Функция seekp() перемещает текущий put-указатель соответствующего файла на offset байт относительно позиции, заданной параметром origin.

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

В следующей программе демонстрируется использование функции seekp(). Она позволяет задать имя файла в командной строке, а за ним — конкретный байт, который нужно в нем изменить. Программа затем записывает в указанную позицию символ "X". Обратите внимание на то, что обрабатываемый файл должен быть открыт для выполнения операций чтения-записи.

/* Демонстрация произвольного доступа к файлу.

*/

#include <iostream>

#include <fstream>

#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])

{

 if(argc!=3) {

  cout << "Применение: имя_программы " << "<имя_файла> <байт>\n";

  return 1;

 }

 fstream out(argv[1], ios::in | ios::out | ios::binary);

 if(!out) {

  cout << "He удается открыть файл.\n";

  return 1;

 }

 out.seekp(atoi(argv[2]), ios::beg);

 out.put('X');

 out.close();

 return 0;

}

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

/* Отображение содержимого файла с заданной стартовой позиции.

*/

#include <iostream>

#include <fstream>

#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])

{

 char ch;

 if(argc!=3) {

  cout << "Применение: имя_программы "<< "<имя_файла> <стартовая_позиция>\n";

  return 1;

 }

 ifstream in(argv[1], ios::in | ios::binary);

 if(!in) {

  cout << "He удается открыть файл.\n";

  return 1;

 }

 in.seekg(atoi(argv[2]), ios::beg);

 while(in.get (ch)) cout << ch;

 return 0;

}

Функция tellg() возвращает текущую позицию get-указателя, а функция tellp() — текущую позицию put-указателя.

Текущую позицию каждого файлового указателя можно определить с помощью этих двух функций.

pos_type tellg();

pos_type tellp();

Здесь используется тип pos_type (он определен в классе ios), позволяющий хранить самое большое значение, которое может возвратить любая из этих функций.

Существуют перегруженные версии функций seekg() и seekp(), которые перемещают файловые указатели в позиции, заданные значениями, возвращаемыми функциями tellg() и tellp() соответственно. Вот как выглядят их прототипы,

istream &seekg(pos_type position);

ostream &seekp(pos_type position);

Проверка статуса ввода-вывода

С++-система ввода-вывода поддерживает статусную информацию о результатах выполнения каждой операции ввода-вывода. Текущий статус потока ввода-вывода описывается в объекте типа iostate, который представляет собой перечисление (оно определено в классе ios), включающее следующие члены.

Статусную информацию о результате выполнения операций ввода-вывода можно получать двумя способами. Во-первых, можно вызвать функцию rdstate(), которая является членом класса ios. Она имеет такой прототип.