Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C++.doc
Скачиваний:
7
Добавлен:
01.05.2025
Размер:
1.44 Mб
Скачать

7.6.4 Определение конца файла

Для определения момента достижения конца файла можно использовать функцию-член eof(), имеющую следующий прототип:

int eof();

При достижении конца файла она возвращает ненулевое число, в противном случае возвраща­ется ноль.

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

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

istream& seekg(streamoff offset, seek_dir origin);

ostream& seekp(streamoff offset, seek_dir origin);

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

Система ввода/вывода C++ обрабатывает два указателя, ассоциированные с каждым файлом. Один из них, 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>

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

{

if(argc != 3) return 1;

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

if(!out) return 1;

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

out.put('x');

out.close();

return 0;

}

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

#include <iostream.h>

#include <fstream.h>

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

{

char ch;

if(argc != 3) return 1;

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

if (!in) 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.

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