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

 out.close();

 return 0;

}

Следующая программа считывает целое число, float-значение, символ и строку из файла, созданного при выполнении предыдущей программой.

// Считывание данных из файла.

#include <iostream>

#include <fstream>

 using namespace std;

int main()

{

 char ch;

 int i;

 float f;

 char str[80];

 ifstream in("test");

 if(!in) {

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

  return 1;

 }

 in >> i;

 in >> f;

 in >> ch;

 in >> str;

 cout << i << " " << f << " " << ch << "\n";

 cout << str;

 in.close();

 return 0;

}

Следует иметь в виду, что при использовании оператора ">>" для считывания данных из текстовых файлов происходит преобразование некоторых символов. Например, "пробельные" символы опускаются. Если необходимо предотвратить какие бы то ни было преобразования символов, откройте файл в двоичном режиме доступа. Кроме того, помните, что при использовании оператора ">>" для считывания строки ввод прекращается при обнаружении первого "пробельного" символа.

Неформатированный ввод-вывод данных в двоичном режиме

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

Для выполнения двоичных операций файлового ввода-вывода необходимо открыть файл с использованием спецификатора режима ios::binary. Необходимо отметить, что функции обработки неформатированных файлов могут работать с файлами, открытыми в текстовом режиме доступа, но при этом могут иметь место преобразования символов, которые сводят на нет основную цель выполнения двоичных файловых операций.

Функция get() считывает символ из файла, а функция put() записывает символ в файл.

В общем случае существует два способа записи неформатированных двоичных данных в файл и считывания их из файла. Первый состоит в использовании функции-члена put() (для записи байта в файл) и функции-члена get() (для считывания байта из файла). Второй способ предполагает применение "блочных" С++-функций ввода-вывода read() и write(). Рассмотрим каждый способ в отдельности.

Использование функций get() и put()

Функции get() и put() имеют множество форматов, но чаще всего используются следующие их версии:

istream &get(char &ch);

ostream &put(char ch);

Функция get() считывает один символ из соответствующего потока и помещает его значение в переменную ch. Она возвращает ссылку на поток, связанный с предварительно открытым файлом. При достижении конца этого файла значение ссылки станет равным нулю. Функция put() записывает символ ch в поток и возвращает ссылку на этот поток.

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

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

*/

#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;

 }