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

streamsize gcount();

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

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

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

bool eof();

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

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

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

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

*/

#include <iostream>

#include <fstream>

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 <iostream>

#include <fstream>

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<f1.gcount(); i++)

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

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

    f1.close();

    f2.close();

    return 0;

   }