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

#include

#include

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. Она имеет такой прототип.

iostate rdstate();

Функция rdstate() возвращает текущий статус флагов ошибок. Нетрудно догадаться, что, судя по приведенному выше списку флагов, функция rdstate() возвратит значение goodbit при отсутствии каких бы то ни было ошибок. В противном случае она возвращает соответствующий флаг ошибки.

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

bool bad();

bool eof();

bool fail();

bool good();

Функция eof() рассматривалась выше. Функция bad() возвращает значение ИСТИНА, если в результате выполнения операции ввода-вывода был установлен флаг badbit. Функция fail() возвращает значение ИСТИНА, если в результате выполнения операции ввода-вывода был установлен флаг failbit. Функция good() возвращает значение ИСТИНА, если при выполнении операции ввода-вывода ошибок не произошло. В противном случае они возвращают значение ЛОЖЬ.

Если при выполнении операции ввода-вывода произошла ошибка, то, возможно, прежде чем продолжать выполнение программы, имеет смысл сбросить флаги ошибок. Для этого используйте функцию clear() (член класса ios), прототип которой выглядит так.

void clear (iostate flags = ios::goodbit);

Если параметр flags равен значению goodbit (оно устанавливается по умолчанию), все флаги ошибок очищаются. В противном случае флаги устанавливаются в соответствии с заданным вами значением.

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

Использование перегруженных операторов ввода-вывода при работе с файлами
Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги