Обратите внимание на то, что в инструкциях обращения к функциям read() и write() выполняются операции приведения типа, которые обязательны при использовании буфера, определенного не в виде символьного массива.

Функция gcount() возвращает количество символов, считанных при выполнении последней операции ввода данных.

Если конец файла будет достигнут до того, как будет считано num символов, функция read() просто прекратит выполнение, а буфер будет содержать столько символов, сколько удалось считать до этого момента. Точное количество считанных символов можно узнать с помощью еще одной функции-члена gcount(), которая имеет такой прототип.

streamsize gcount();

Функция gcount() возвращает количество символов, считанных в процессе выполнения последней операции ввода данных.

Обнаружение конца файла

Обнаружить конец файла можно с помощью функции-члена eof(), которая имеет такой прототип.

bool eof();

Эта функция возвращает значение true при достижении конца файла; в противном случае она возвращает значение false.

Функция eof() позволяет обнаружить конец файла.

В следующей программе для вывода на экран содержимого файла используется функция eof().

/* Обнаружение конца файла с помощью функции eof().

*/

#include

#include

using namespace std;

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

{

 char ch;

 if(argc!=2) {

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

  return 1;

 }

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

 if(!in) {

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

  return 1;

 }

 while(!in.eof()) {

  // использование функции eof()

  in.get(ch);

  if( !in.eof()) cout << ch;

 }

 in.close();

 return 0;

}

Пример сравнения файлов

Следующая программа иллюстрирует мощь и простоту применения в C++ файловой системы. Здесь сравниваются два файла с помощью функций двоичного ввода-вывода read(), eof() и gcount(). Программа сначала открывает сравниваемые файлы для выполнения двоичных операций (чтобы не допустить преобразования символов). Затем из каждого файла по очереди считываются блоки информации в соответствующие буферы и сравнивается их содержимое. Поскольку объем считанных данных может быть меньше размера буфера, в программе используется функция gcount(), которая точно определяет количество считанных в буфер байтов. Нетрудно убедиться в том, что при использовании файловых С++-функций для выполнения этих операций потребовалась совсем небольшая по размеру программа.

// Сравнение файлов.

#include

#include

using namespace std;

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

{

 register int i;

 unsigned char buf1[1024], buf2[1024];

 if(argc!=3) {

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

  return 1;

 }

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

 if(!f1) {

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

  return 1;

 }

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

 if(!f2) {

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

  return 1;

 }

 cout << "Сравнение файлов ...\n";

 do {

  f1.read((char *) buf1, sizeof buf1);

  f2.read((char *) buf2, sizeof buf2);

  if(f1.gcount() != f2.gcount()) {

   cout << "Файлы имеют разные размеры.\n";

   f1.close();

   f2.close();

   return 0;

  }

  // Сравнение содержимого буферов.

  for(i=0; i

   if(buf1[i] != buf2[i]) {

    cout << "Файлы различны.\n";

    f1.close();

    f2.close();

    return 0;

   }

 }while(!f1.eof() && !f2.eof());

 cout << "Файлы одинаковы.\n";

 f1.close();

 f2.close();

 return 0;

}

Проведите эксперимент. Размер буфера в этой программе жестко установлен равным 1024. В качестве упражнения замените это значение const-переменной и опробуйте другие размеры буферов. Определите оптимальный размер буфера для своей операционной среды.

Перейти на страницу:

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

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