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

          return 1;

}

double r = 5.2;                                                          //определение переменной

  ofbin.write(reinterpret_cast<char *>(&r), sizeof(double));  //вывод в поток переменной r

  struct date  {int i, j, k;};                //определение структуры

  date d  = {12, 3, 2008};                 //инициализация структуры

  ofbin.write(reinterpret_cast<char *> (&d), sizeof(date));  //вывод структуры в поток

  int m[6] = {1, 2, 3, 4, 5, 6};            //определение и инициализация массива

  ofbin.write(reinterpret_cast<char *>(&m[0]), sizeof (m));   //вывод массива в поток

ofbin.close();                                                //закрываем файл

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

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

          return 2;

 }

double f; date dd;

ifbin.read (reinterpret_cast<char *> (&f), sizeof(f));  //чтение из потока значения f

cout <<f<<endl;

ifbin.read(reinterpret_cast<char *> (&dd), sizeof(date)); //чтение из потока целиком dd

cout << dd.i <<”  “ << dd.j<< “   “<< dd.k << endl ;

int p[6];

ifbin.read(reinterpret_cast<char *>(&p[0]), sizeof (p));  //чтение из потока всего массива f

cout << p[0] << “  “ << p[5]<< endl;

return 0;

}

3.  Копирование бинарных файлов

 Бинарный файл, полученный в примере 2, копируется в другой бинарный файл:

#include <iostream.h>

#include <fstream.h>

void filecopy (ifstream &in, ofstream &out); //прототип функции копирования

void main()

{ ifstream ifbin (“d:\\number.bin”, ios::binary|ios::nocreate);

  ofstream ofbin (“d:\\number1.bin”, ios::binary);

  if (ifbin && ofbin) filecopy (ifbin, ofbin);                                                  //при успешном открытии потоков, выполняется копирование

  ifbin.close();        //закрываем файлы

 ofbin.close();

struct date  {int i, j, k;};      //определение структуры

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

ifstream ifbin1 (“d:\\number1.bin”, ios::binary|ios::nocreate);

double f; date dd;

ifbin1.read (reinterpret_cast<char *> (&f), sizeof(double));

cout << f<<endl;

ifbin1.read(reinterpret_cast<char *> (&dd), sizeof(date));

cout << dd.i <<”  “ << dd.j<< “   “<< dd.k << endl ;

int p[6];

ifbin1.read(reinterpret_cast<char *> (&p[0]), sizeof (p));

cout << p[0] << “  “ << p[5]<< endl;

}

void filecopy (ifstream &in, ofstream &out)

{char ch;

  while (in.get(ch))

                        out.put(ch);

}

4. Использование функция get() для чтения из бинарного файла, имя которого задается в командной строке

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

#include <fstream.h>

#include <iostream.h>

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

{char ch;

  if (argc!=2) { cout << "Input name of file\n";

                        return 1;

         }

ifstream infile (argv[1], ios::binary|ios::nocreate);   //открытие файла и потока  для ввода

if ( !infile) {    cout << "Input error\n ";

                        return 2;

                  }

while (!infile.eof()) {

infile.get(ch); // ввод из файла предотвращает игнорирование пробелов

cout << ch;

        }

return 0;   

}

Содержимое файла:

   123 1 2 3 4 qwert  asd

Результаты работы программы:

    123 1 2 3 4 qwert  asd

Внимание !!!

Замена в цикле while (!infile.eof())   оператора ввода infile.get(ch)  на  infile >> ch

изменяет результаты работы программы на:

1231234qwertasd