Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 22

ifstreaminfile (“d:\\TEST.TXT”, ios::nocreate);            //открывается файл для чтения

if (infile) filecopy (infile, outfile);                    //вызов функции копирования

return 0;

}

voidfilecopy (ifstream & inf, ofstream & outf//передача параметров по ссылке!!!

{char ch;

while (inf.get(ch) )           //проверка на конец файла и ввод символа 

outf.put(ch);     //вывод символа  в файл вывода

}   

Проанализируйте возможные способы реализации функции копирования:

voidfilecopy (ifstream & inf, ofstream & outf//передача параметров по ссылке!!!

{char ch= inf.get();

while (!inf.eof() )           //проверка на конец файла и ввод символа 

{ outf.put(ch);     //вывод символа  в файл вывода

ch=inf.get();

}

}   

или такой:

voidfilecopy (ifstream & inf, ofstream & outf//передача параметров по ссылке!!!

{char ch;

while (inf.read(&ch, 1) )             //проверка на конец файла и ввод символа 

outf.write(&ch,1);     //вывод символа  в файл вывода

}   

Примеры использования двоичных файлов

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

 Для считывания и записи блоков двоичных данных в С++ используются функции read() и write(), которые также являются членами потоковых классов соответственно для ввода и для вывода. Их прототипы:

istream &read (char *str, streamsize  count);

ostream &write (const char *str, streamsize  count);

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

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

streamsize gcount();

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

1.  Запись в бинарный файл и чтение из него последовательности случайных чисел

В программе создается бинарный файл для вывода, в который записывается последовательность случайных чисел, и файл закрывается. Затем файл открывается уже в качестве файла для ввода, и записанная ранее информация оттуда считывается и выводится на экран:

#include <fstream.h>

#include <ctime>

#include <iostream.h>

#include <stdlib.h>

int main()

{srand((unsigned) time(NULL));     

 ofstream outfile ("d:/TEST.dat", ios::binary); 

 if(!outfile) {cout<< "error1"<< endl;

                    return 1;

 }

 int a;

for (int i=1; i<=20; i++)

               {a=rand()%6;               

               outfile.write (reinterpret_cast<char *>(&a), sizeof(int)); 

   }

outfile.close();                                   

ifstream infile ("d:/TEST.dat", ios::binary| ios::nocreate);      

 if(!infile) {cout<< "error2"<< endl;

                   return 2;

   }

 while (infile.read (reinterpret_cast<char *>(&a), sizeof(int))) 

               cout << a <<' ';   

 cout << endl;

return 0;  

}

2.  Запись в бинарный файл и чтение из него переменных разных типов

Создаем выходной поток, открываем двоичный файл и связываем его с потоком:

#include <iostream.h>

#include <fstream.h>

int main()

{ofstream ofbin (“d:\\number.bin”, ios::binary);        //открытие потока для вывода

 if(!ofbin) {cout<< "error1"<< endl;                               //если ошибка