Двійковий ввід-вивід
Форматований файловий ввід/вивід чисел доцільно використовувати лише при їх невеликій величині і незначній кількості. В інших випадках значно ефективнішим є двійковий ввід/вивід, при якому числа зберігаються так само, як і в ОП компютера, а не у вигляді символьних рядків. Цілочисельні значення займають 4 байти, натомість текстова версія числа «12345» займає 5 байтів. Ще значнішою є економія для даних типу float.
У програмі 26.6 показано, як у бінарному вигляді масив цілих чисел записується в файл і читається з нього. При цьому використовуються дві функції – write() (метод класу ofstream) та read() (метод класу ifstream). Ці функції сприймають дані в термінах байтів (тип char). Їм все одно, як організовані дані і що вони собою являють, - вони просто переносять байти з з буферу в файл і назад. Параметрами цих функцій є адреса буферу і його довжина. Адреса повинна бути визначена за допомогою reinterpret_cast відносно типу char*. Другим параметром є довжина в байтах (а не число елементів даних в буфері).
#include <fstream>
#include<iostream>
#include <conio>
using namespace std;
const int MAX=100;
int buff[MAX];
int main()
{ int j=0;
for(j=0;j<MAX;j++)
buff[j]=j;
//створити вихідний потік
ofstream os("edata.dat",ios::binary);
//записати в нього
os.write(reinterpret_cast<char*>(buff),MAX*sizeof(int));
os.close();//закрити його
for(j=0;j<MAX;j++)
buff[j]=0;
ifstream is("edata.dat",ios::binary); //створити вхідний потік
is.read(reinterpret_cast<char*>(buff),MAX*sizeof(int));
for(j=0;j<MAX;j++)
if(buff[j]!=j)
{cerr <<"Nekorektni dani\n";return 1;}
cout<<"Korektni dani\n";
getch();
return 0;
}
Програма 26.6
При роботі з бінарними даними в якості другого параметра write() та read() слід використовувати ios::binary. Це необхідно тому, що текстовий режим, використовуваний за замовчуванням, допускає дещо вільну поведінку з даними. Наприклад, спеціальний символ '\n' займає 2 байти. Це робить текст більш зручним для читання в DOS утилітами типу TYPE, але не годиться для бінарних даних, оскільки будь-який байт, що не має ASCII-коду 10 відтворюється 2 байтами. Аргумент ios::bonary – типовий приклад біту стану.
Дата добавления: 2015-08-26; просмотров: 865;