ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн

Ввод/вывод символов

Функции put() и get(), являющиеся методами ostream и istream соответственно,

могут быть использованы для ввода и вывода единичных символов. В программе

OCHAR строка выводится именно посимвольно.

 

Листинг 12.6. Программа OCHAR

// ochar.cpp

// Посимвольный файловый вывод

#include <fstream>                // для файловых функций

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

  string str = "Время – великий учитель, но, увы, "

           "оно убивает своих учеников.  Берлиоз";

 

  ofstream outfile("TEST.TXT");   // Создать выходной файл

  for(int j=0; j<str.size(); j++) // каждый символ

    outfile.put( str[j] );        // записывать в файл

  cout << "Файл записан\n";

  return 0;

}

В этой программе объект ofstream создается так же, как в программе OLINE.

Длина объекта класса string по имени str находится с помощью метода size(),

а символы выводятся в цикле for функцией put(). Афоризм Гектора Берлиоза

(композитора XIX века) записывается в файл TEST.TXT. Считываем и выводим

этот файл с помощью программы ICHAR.

Листинг 12.7. Программа ICHAR

// ichar.cpp

// Посимвольный файловый ввод

#include <fstream>             // для файловых функций

#include <iostream>

using namespace std;

 

int main()

{

  char ch;                     // символ для считывания

  ifstream infile("TEST.TXT"); // входной файл

  while( infile )              // читать до EOF или ошибки

    {

    infile.get(ch);            // считать символ

    cout << ch;                // и вывести его

    }

  cout << endl;

  return 0;

}

В этой программе используется функция get(). Чтение производится до при-

знака окончания файла (или возникновения ошибки). Каждый прочитанный

символ выводится с помощью cout, поэтому на экран в результате работы про-

граммы будет выведен весь афоризм.

Есть и другой способ читать символы из файла — использовать функцию

rdbuf() (она является методом класса ios). Функция возвращает указатель на

объект класса streambuf (или filebuf), ассоциированный с потоковым объектом.

В этом объекте находится буфер символов, считанных из потока, поэтому мож-

но использовать указатель на него в качестве объекта данных.

 

Листинг 12.8. Программа ICHAR2

// ichar2.cpp

// Файловый ввод символов

#include <fstream>             // для файловых функций

#include <iostream>

using namespace std;

 

int main()

{

  ifstream infile("TEST.TXT"); // создать входной файл

 

  cout << infile.rdbuf();      // передать его буфер в cout

  cout << endl;

  return 0;

}

Результат работы этой программы совпадает с ICHAR. Можно взять с полки

пирожок за написание самой короткой программы чтения из файла. Обратите

внимание на то, что функция rdbuf() сама знает, что следует прекратить работу

при достижении EOF.

 

21