НЕФОРМАТИРУЕМЫЙ ВВОД- ВЫВОД
Когда вы открываете файл в текстовом режиме, происходит следующее:
при вводе каждая пара символов '\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;
}