НЕФОРМАТИРУЕМЫЙ ВВОД- ВЫВОД

Когда вы открываете файл в текстовом режиме, происходит следующее:

при вводе каждая пара символов '\r' +'\n' (возврат каретки + перевод строки) преобразуется в символ перевода строки '\n';

при выводе каждый символ перевода строки '\n' преобразуется в пару '\r' + '\n' (возврат каретки + перевод строки).

Это не всегда удобно. Если вы собираетесь использовать выводимый файл для последующего ввода в (возможно, другую) программу, лишние байты информации ни к чему. С этой целью система вводавывода предоставляет вам возможность осуществления неформатируемого ввода-вывода, то есть записи и чтения двоичной информации (иногда говорят – сырых данных). Для осуществления ввода-вывода в двоичном режиме, включите флаг ios :: binary в параметр open_mode, передаваемый конструктору потока или функции open ( ). Чтение двоичной информации из файла осуществляется функцией read ( ), которая имеет следующий прототип:

istream_type& read ( char_type* s , streamsize n ) ;

Здесь параметр s задает буфер для считывания данных, а параметр n – число читаемых символов.

Запись двоичных данных осуществляет функция-член write ( ):

ostream_type& write ( const char_type* s , streamsize n ) ;

Эта функция получает n символов из буфера, адрес которого задан параметром s, и вставляет их в поток вывода. Рассмотрим пример:

// peregcincout.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <iostream>

#include <fstream>

using namespace std;

class Dot

{

int x;

int y;

public:

 

int GetX(){return x;}

void SetX(int _x){x=_x;}

Dot(int _x,int _y){x=_x;y=_y;}

friend ostream & operator<<(ostream &out, Dot &d);

friend istream & operator>>(istream &in, Dot &d);

};

ostream & operator<<(ostream &out, Dot &d)

{

out<<d.x<<' '<<d.y<<' ';

return out;

}

istream & operator>>(istream &in, Dot &d)

{

in>>d.x>>d.y;

return in;

}

int _tmain(int argc, _TCHAR* argv[])

{

Dot d1(9,2),d2(8,7);

int x = 255 ;

char S [ ] ="Testing bynary .";

ofstream ofs ("Test.dat",ios::binary) ; // открывает файл для вывода в двоичном режиме

if ( ! ofs )

{

cout << "File not open \n";

return 1 ;

}

ofs.write (( char*) & x , sizeof ( int )) ;

ofs.write (( char*) & S , sizeof ( S )) ;

ofs.write (( char*) & d1 , sizeof ( Dot )) ;

ofs.write (( char*) & d2 , sizeof ( Dot )) ;

x=33;

ofs.write (( char*) & x , sizeof ( int )) ;

ofs.write (( char*) & S , sizeof ( S )) ;

ofs.write (( char*) & d2 , sizeof ( Dot )) ;

ofs.write (( char*) & d1 , sizeof ( Dot )) ;

ofs.close();

ifstream ifs ("Test.dat",ios::binary) ; // открывает файл для ввода в двоичном режиме

if ( ! ifs )

{

cout << "File not open \n";

return 1 ;

}

while(ifs.read (( char*) & x , sizeof ( int )) ,!ifs.eof())

{

ifs.read (( char*) & S , sizeof ( S )) ;

ifs.read ( ( char*) & d2 , sizeof ( Dot )) ;

ifs.read ( ( char*) & d1 , sizeof ( Dot )) ;

cout << "\n x="<< x << " s= " << S << '\n'<<"d2="<<d2<< '\n'<<"d1="<<d1 ;

}

system("pause");

return 0;

}