Двійковий ввід-вивід

Форматований файловий ввід/вивід чисел доцільно використовувати лише при їх невеликій величині і незначній кількості. В інших випадках значно ефективнішим є двійковий ввід/вивід, при якому числа зберігаються так само, як і в ОП компютера, а не у вигляді символьних рядків. Цілочисельні значення займають 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; просмотров: 819;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.003 сек.