Программирование на C и C++

Онлайн справочник программиста на C и C++

Произвольный доступ

Система ввода/вывода С++ позволяет осуществлять произвольный доступ с использованием фун­кции seekg() и seekp(). Их наиболее употребительной формой является следующая:

istream &seekg(streamoff offset, seek_dir origin);

ostream &seekp(streamoff offset, seek_dir origin);

Здесь тип streamoff определен в заголовочном файле iostream.h. Он определяет область значе­ний, которые может принимать величина offset. В настоящее время streamoff определен с помо­щью функции typedef как long.

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

Функция seekg() перемещает указатель get pointer на число байт offset от заданного origin, принимающего одно из следующих трех значений:

Величина Значение
ios::beg Начало файла
ios::cur Текущее положение
ios::end Конец файла

 Функция seekp() перемещает указатель put pointer на offset байт от заданного origin, в качестве которого служит одно из указанных выше значений.

Следующая программа демонстрирует использование функции seekp(). Она позволяет указать имя файла в командной строке, после которого следует указать, какой именно байт в файле надо заменить. Затем функция пишет символ «X» в указанную позицию. Следует обратить внимание, что файл должен быть открыт для выполнения операций чтения и записи.

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc!=3) {
cout << "Usage: CHANGE <filename> <byte>\n";
return 1;
}
fstream out(argv[1], ios::in | ios::out | ios::binary);
if (!out) {
cout << "Cannot open file.\n";
return 1;
}
out.seekp(atoi(argv[2]), ios::beg);
out.put('X');
out.close () ;
return 0;
}

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

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char ch;
if (argc!=3) {
cout << "Usage: NAME <filename> <starting location>\n";
return 1;
}
ifstream in(argv[1], ios::in | ios::binary);
if (!in) {
cout << "Cannot open file.\n";
return 1;
}
in.seekg(atoi(argv[2]), ios::beg);
while (in.get(ch))
cout << ch;
in.сlоse();
return 0;
}

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

streampos tellg();

streampos tellp();

Здесь тип streampos определен в заголовочном файле iostream.h. В текущей версии он опреде­лен с помощью функции typedef как long.

Как можно видеть, система ввода/вывода С++ является одновременно и мощной и гибкой. В этом разделе были рассмотрены некоторые наиболее употребительные функции, хотя С++ включает несколько других важных функций. Например, стоит, вероятно, познакомиться с функцией getline() (определенной istream) и различными формами перегруженных функций ввода/вывода.