464.14K
Category: programmingprogramming

Бінарні файли

1.

ЛЕКЦІЯ 18
Бінарні файли.

2.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Файл - іменований набір байтів, який може бути
збережений на деякому накопичувачі.
Під файлом розуміється деяка послідовність байтів, яка
має своє, унікальне ім'я, наприклад файл.txt.
В одній директорії не можуть перебувати файли з
однаковими іменами.
Під ім'ям файлу розуміється не тільки його назву, а й
розширення, наприклад: file.txt і file.dat - різні файли, хоч
і мають однакові назви.
Існує таке поняття, як повне ім'я файлів - це повна
адреса до директорії файлу із зазначенням імені файлу,
наприклад: D:\docs\file.txt.
Для роботи з файлами необхідно підключити заголовний
файл <fstream>.
У <fstream> визначені кілька класів і підключені
заголовки
<ifstream> - файловий ввід
<ofstream> - файловий вивід.
2

3.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Файловий ввід/вивід аналогічний стандартному вводу/
виводу,
Відмінність - це те, що введення / виведення
виконуватися не на екран, а в файл.
Якщо введення / виведення на стандартні пристрої
виконується за допомогою об'єктів cin і cout, то для
організації файлового введення / виводу досить створити
власні об'єкти, які можна використовувати аналогічно
операторам cin і cout.
Наприклад, необхідно створити текстовий файл і
записати в нього рядок Робота з файлами в С ++.
Для цього необхідно виконати наступні кроки:
1. створити об'єкт класу ofstream;
2. зв'язати об'єкт класу з файлом, в який буде проводитися
запис;
3. записати рядок в файл;
4. закрити файл.
3

4.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Чому необхідно створювати об'єкт класу ofstream, а не
класу ifstream?
Тому, що потрібно зробити запис в файл, а якби потрібно
було вивантажити дані з файлу, то створювався б об'єкт
класу ifstream.
// створюємо об'єкт для запису в файл
ofstream / * ім'я об'єкта * /; // об'єкт класу ofstream
Назвемо об'єкт - fout, Ось що вийде:
ofstream fout;
Об'єкт необхідний, щоб можна було записувати дані у
файл. Уже об'єкт створений, але не пов'язаний з файлом, в
який потрібно записати рядок.
4
fout.open ( "cppstudio.txt"); // пов'язуємо об'єкт з файлом

5.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Через операцію точка отримуємо доступ до методу
класу open (), в круглих дужках якого вказуємо ім'я
файлу. Зазначений файл буде створений в поточній
директорії з програмою. Якщо файл з таким ім'ям
існує, то існуючий файл буде замінений новим.
fout << "Робота з файлами в С ++"; // запис рядка в
файл
Використовуючи операцію передачі в потік спільно з
об'єктом fout рядок «Робота з файлами в С ++»
записується в файл.
fout.close ();
// закриваємо файл
5

6.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
В одному рядку можна створити об'єкт і зв'язати його з файлом.
ofstream fout ("cppstudio.txt");
// створюємо об'єкт класу ofstream і пов'язуємо його з файлом cppstudio.txt
Об'єднаймо весь код і отримаємо таку програму
#include "stdafx.h"
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ofstream fout("cppstudio.txt");
fout << "Работа с файлами в С++";
fout.close();
system("pause");
return 0;
}
6

7.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Для того щоб прочитати файл знадобиться виконати
ті ж кроки, що і під час запису в файл з невеликими
змінами:
створити об'єкт класу ifstream і зв'язати його з файлом, з
якого буде проводитися зчитування;
2. прочитати файл;
3. закрити файл.
1.
7

8.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus");
char buff[50];
ifstream fin("cppstudio.txt");
fin >> buff;
// вважали перше слово з файлу
cout << buff << endl;
// надрукували це слово
fin.getline (buff, 50);
fin.close ();
cout << buff << endl;
system("pause");
return 0;
}
// вивести рядок з файлу
// закриваємо файл
// надрукували цей рядок
8

9.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "rus");
char buff[50];
ifstream fin ("cppstudio.doc");
if (! fin.is_open ())
// якщо файл не відкритий
cout << "Файл не може бути відкритий! \ n"; // повідомити про це
else
{ fin >> buff;
// вивели перше слово з файлу
cout << buff << endl;
fin.getline (buff, 50);
// вивели рядок з файлу
fin.close ();
// закриваємо файл
cout << buff << endl;
system ("pause");
}
return 0; }
9

10.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Результат роботи програми.
Файл не може бути відкритий!
Для продовження натисніть будь-яку клавішу. . .
Як видно програма повідомила про неможливість
відкрити файл.
Тому, якщо програма працює з файлами,
рекомендується скористатися цією функцією,
is_open (),
навіть, якщо впевнені, що файл існує
10

11.

РЕЖИМИ ВІДКРИТТЯ ФАЙЛІВ
Режими відкриття файлів встановлюють характер використання
файлів. Для установки режиму в класі ios_base передбачені константи,
які визначають режим відкриття файлів
Константа
ios_base::in
ios_base::out
ios_base::ate
ios_base::app
ios_base::trunc
ios_base::binary
Опис
відкрити файл для читання
відкрити файл для запису
при відкритті перемістити вказівник в
кінець файлу
відкрити файл для запису в кінець файлу
видалити вміст файлу, якщо він існує
відкриття файлу в двійковому режимі
11

12.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Режими відкриття файлів можна встановлювати
безпосередньо при створенні об'єкта або при
виконанні функції open ().
ofstream fout ("cppstudio.txt", ios_base :: app);
// відкриваємо файл для додавання інформації до
кінця файлу
fout.open ("cppstudio.txt", ios_base :: app);
// відкриваємо файл для додавання інформації до
кінця
12

13.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Режими відкриття файлів можна комбінувати за
допомогою поразрядной логічної операції або |,
наприклад: ios_base :: out | ios_base :: trunc відкриття файлу для запису, попередньо очистивши
його.
Об'єкти класу ofstream, при зв'язці з файлами за
замовчуванням містять режими відкриття файлів
ios_base :: out | ios_base :: trunc.
Об'єкти класу ifstream зв'язуючись з файлом, мають
за замовчуванням режим відкриття файлу
ios_base :: in - файл відкритий тільки для читання.
13

14.

ПОТОКОВЕ ВВЕДЕННЯ ТА ВИВЕДЕННЯ
Режим відкриття файлу ще називають – прапор
Зверніть увагу на те, що прапори ate і app по опису
дуже схожі, вони обидва переміщують вказівник в
кінець файлу, але прапор
app дозволяє проводити запис, тільки в кінець файлу,
ate просто переставляє прапор в кінець файлу і не
обмежує місця запису.
14

15.

ПРИКЛАД
Розробимо програму, яка, використовуючи операцію
sizeof (), буде обчислювати характеристики основних
типів даних в С ++ і записувати їх в файл.
Характеристики:
1. число байт, що відводиться під тип даних
2. максимальне значення, яке може зберігати певний
тип даних.
15

16.

ПРИКЛАД
Запис в файл повинна виконуватися в такому форматі:
1
2
3
4
5
6
7
8
9
10
11
data type
bool
char
short int
unsigned short int
int
unsigned int
long int
unsigned long int
float
long float
double
byte
= 1
= 1
= 2
= 2
= 4
= 4
= 4
= 4
= 4
= 8
= 8
max value
255.00
255.00
32767.00
65535.00
2147483647.00
4294967295.00
2147483647.00
4294967295.00
2147483647.00
9223372036854775800.00
9223372036854775800.00
16

17.

ПРИКЛАД
#include "stdafx.h"
#include <iostream>
#include <fstream>
// робота з файлами
#include <iomanip> // маніпулятори введення / виведення
using namespace std;
int main (int argc, char * argv [])
{
setlocale (LC_ALL, "rus");
ofstream fout ( "data_types.txt", ios_base :: out | ios_base :: trunc);
if (! fout.is_open ()) // якщо файл небув відкритий
{
cout << "Файл не може бути відкритий або створений \ n";
return 1; }
fout << "data type" << "byte" << "" << "max value" << endl << "bool =" <<
sizeof (bool) << "" << fixed << setprecision (2) << (pow (2, sizeof (bool) * 8.0) 1) << endl << "char =" << sizeof (char) << "" << fixed << setprecision (2)
<< (pow (2, sizeof (char) * 8.0) - 1) << endl
……
fout.close ();
17
cout << "Дані успішно записані в файл data_types.txt \ n";
system ( "pause");
return 0; }

18.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ
Система введення-виведення С ++ дозволяє
здійснювати довільний доступ з використанням
методів seekg () і seekp ().
• ifstream & seekg (Зсув, Позиція);
• ofstream & seekp (Зсув, Позиція);
Зсув визначає область значень в межах файлу (long
int).
18

19.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ
Система введення-виведення С ++ обробляє два
вказівника, асоційовані з кожним файлом:
get pointer g - визначає, де саме в файлі буде
проводитися наступна операція введення;
put pointer p - визначає, де саме в файлі буде
проводитися наступна операція виведення.
Позиція зміщення визначається як,
Позиція
ios::beg
ios::cur
ios::end
Значення
початок файлу
поточний стан
кінець файлу
19

20.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ
Коли здійснюються операції введення або виведення,
відповідний вказівник автоматично
переміщається.
За допомогою методів seekg () і seekp () можна
отримати доступ до файлу в довільному місці.
Можна визначити поточну позицію файлового
вказівника, використовуючи такі функції:
streampos tellg () - позиція для введення
streampos tellp () - позиція для виведення
20

21.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ. ПРИКЛАД
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
char s[80];
fstream inOut;
inOut.open("file.txt", ios::out);
inOut << "строчка текста" << endl;
inOut.seekp(8, ios::beg);
inOut << "еще строчка текста";
inOut.close();
inOut.open("file.txt", ios::in);
inOut.seekg(-6, ios::end);
inOut >> s;
inOut.close();
cout << s;
cin.get();
return 0;
}
21

22.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ. ПРИКЛАД
В результаті виконання першої частини програми
буде створено файл
Друга частина програми виведе в консоль
22

23.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ. ПРИКЛАД
Ще один приклад. Припустимо, нам потрібно заповнювати таблицю
ПІБ
Дата народження
Хобі
Причому кожна знову введений рядок повинна розміщуватися в
таблиці безпосередньо під "шапкою".
Алгоритм рішення задачі наступний:
1. формуємо чергову рядок для виведення
2. відкриваємо файл для читання, зчитуємо з нього дані і
зберігаємо їх в масив рядків
3. закриваємо файл
4. відкриваємо файл для запису
5. виводимо "шапку" таблиці
6. виводимо новий рядок
7. виводимо всі збережені рядки назад в файл, починаючи з
рядка після шапки
23

24.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ. ПРИКЛАД
#include <iostream>
#include <fstream>
using namespace std;
#define LINES 100
int main() {
char line[LINES][100];
char str[30];
char s[] ="|
|
|
|";
cout << "ПІБ: ";
cin.getline (str, 30); // вводимо ПІБ
for (int i = 0; str [i]! = '\ 0'; i ++)
// копіюємо в рядок без 0
cout << "Дата: ";
cin.getline(str,30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 33] = str[i];
fstream inOut;
inOut.open ("file.txt", ios :: in);
// Прочитуємо з файлу наявні дані
int count = 0;
while (inOut.getline (line [count], 100))
count ++;
inOut.close ();
inOut.open ("file.txt", ios :: out);
inOut << "-------------------------- "<< endl;
s [i + 2] = str [i];
// починаючи з вказаної позиції
cout << "Хобі: ";
cin.getline(str,30);
for (int i = 0; str[i] != '\0'; i++)
s[i + 50] = str[i];
inOut << "| ПІБ | Дата | Хобі |" <<
endl;
inOut << "--------------------------- "<< endl;
inOut << s << endl;
inOut << "---------------------------- "<< endl;
for (int j = 3; j < count; j++)
{ inOut << line[j] << endl; }
inOut.close();
cin.get(); return 0; }
24

25.

ДОВІЛЬНИЙ ДОСТУП ДО ФАЙЛУ
Результат виконання:
Отриманий файл даних:
25

26.

БИНАРНІ ФАЙЛИ
Двійковий (бінарний) файл - в широкому сенсі:
послідовність довільних байтів. Назва пов'язана з
тим, що байти складаються з біт, тобто бінарних
(binary) цифр.
У вузькому сенсі слова виконавчі файли
протиставляються текстових файлів.
26

27.

БИНАРНІ ФАЙЛИ: ОБРОБКА
В операційних системах і бібліотеках програмування
може бути передбачена спеціальна обробка
текстових файлів на відміну від бінарних.
Наприклад, в системах MS-DOS і Windows бібліотека
стандартного вводу-виводу мови C реалізована:
відкриття файлу в «текстовому» режимі
послідовність символів \r \n читається як один
символ \n
операція запису, навпаки, записує символ \ n в
файл у вигляді послідовності \r \n.
символ ^ Z там розглядається як кінець текстового
файлу, тому при читанні файлу в текстовому
режимі все, що йде після цього символу,
27
ігнорується.

28.

БИНАРНІ ФАЙЛИ: ВІЗУАЛІЗАЦІЯ
Для наочного уявлення двійкового файлу він
розбивається на частини рівного розміру, що
подаються у вигляді чисел, записуваних, в
шістнадцятковій системі, іноді в вісімковій,
двійковій або десяткового.
Зазначений розмір частини може дорівнювати одному
октету, а також двом або чотирьом (в разі розбиття на
частини по кілька октетів застосовується порядок
байтів, прийнятий на використовуваної платформі).
Залежність діапазону подаються чисел від розміру
шматка показана в таблиці:
28

29.

МОДЕЛЬ ДВІЙКОВОГО ФАЙЛУ
Двійковий файл відрізняється від текстового тим, що дані в
ньому представлені у внутрішній формі.
А оскільки при внутрішньому поданні використовується
двійкова система числення, тому файли називаються
двійковими.
Двійковий файл є аналогом внутрішньої пам'яті - необмеженим
масивом байтів з можливістю безпосереднього звернення
(довільного доступу) до будь-якої його частини.
Така модель файлу повністю збігається з системою уявлень,
прийнятої в Сі для роботи з пам'яттю на низькому (фізичному
рівні).
1.
2.
3.
Фізична пам'ять має байтную структуру - одиницею адресації є
байт;
Будь-яка змінна займає фіксовану кількість байтів, яке
визначається її типом. Операція sizeof повертає цю розмірність;
Вказівник на змінну інтерпретується як її адресу в пам'яті.
Перетворення типу вказівника до void * дозволяє інтерпретувати
його як «чистий» адреса, а перетворення до char * - як вказівник 29
на
масив байтів (фізичне уявлення пам'яті).

30.

МОДЕЛЬ ДВІЙКОВОГО ФАЙЛУ
Функції двійкового введення-виведення fread і fwrite
переносять вміст пам'яті в двійковий файл, тобто байт в
байт без будь-яких перетворень.
Функції використовуються для перенесення даних з файлу
в пам'ять програми (читання) і назад (запис).
int fread (void * buf, int size, int nrec, FILE * fd);
int fwrite (void * buf, int size, int nrec, FILE * fd);
Функціонально fread читає, а функція fwrite пише в файл,
починаючи з поточної позиції, масив з nrec елементів
розмірністю size байтів кожен, повертаючи кількість
30
успішно прочитаних (записаних) елементів.

31.

МОДЕЛЬ ДВІЙКОВОГО ФАЙЛУ
Щоб скористатися цими функціями, необхідно
забезпечити перетворення змінних до «масиву
байтів», використовуючи вказівники для завдання
адрес і операцію sizeof для обчислення розмірності:
// Прочитати цілу змінну і наступний за нею
// динамічний масив з n змінних типу double
int n; // в цілій змінній - розмірність масиву
fread (& n, sizeof (int), 1, fd); // вказівник на змінну int
double * pd = new double [n];
fread (pd, sizeof (double), n, fd); // перетворення до void
* - неявне
31

32.

МОДЕЛЬ ДВІЙКОВОГО ФАЙЛУ
Функція int fseek (FILE * fp, long pos, int mode)
встановлює поточну позицію в файлі на байт з
номером pos. Параметр mode визначає, щодо чого
відраховується поточна позиція у файлі, і має
символічні і числові значення (встановлені в stdio.h):
#define SEEK_SET 0 // Щодо початку файлу
// початок файлу - позиція 0
#define SEEK_CUR 1 // Щодо поточної позиції,
//> 0 - вперед, <0 - назад
#define SEEK_END 2 // Щодо кінця файлу
// (значення pos - негативне)
32

33.

МОДЕЛЬ ДВІЙКОВОГО ФАЙЛУ
Функція fseek повертає значення 0 при успішному позиціонуванні і -1 (EOF) - при
помилці. Різні значення параметра mode визначають різні способи адресації даних в
файлі:
Значення SEEK_SET визначає абсолютну адресацію даних у файлі від його
початку. Зауважимо, що функція ftell повертає поточну позицію в
абсолютному значенні;
Значення SEEK_END за початок координат бере кінець файлу (EOF). Адреси
вже записаних даних мають негативне значення. Наприклад, якщо в кінці
файлу знаходиться ціла змінна, то її позиція при адресації від кінця файлу
буде мати значення 0-sizeof (int). У цьому ж режимі можна визначити
поточну довжину файлу можна простим позиціонуванням:
long fsize;
fseek (fl, 0L, SEEK_END); // Установити позицію на кінець файлу
fsize = ftell (fd); // Прочитати значення поточної позиції
Значення SEEK_CUR дає спосіб відносної адресації від поточного положення
вказівника у файлі. Таким чином, задається відстань в байтах від поточної
змінної до адресується. Якщо це відстань саме знаходиться в файлі, то воно
зазвичай носить назву зсуву.
fseek (fd, 100, SEEK_SET); // За адресою 100 знаходиться зміщення
fread (& P, sizeof (long), 1, fd); // Читається P = 46, після читання поточна позиція
fseek (fd, i, SEEK_CUR); // 100 + sizeof (long) = 104, позиціонування 104 + 46 = 150
33

34.

МОДЕЛЬ ДВІЙКОВОГО ФАЙЛУ
При відкритті або створенні нового файлу необхідно
вказати режим роботи з файлом як з двійковим.
Серед безлічі режимів можна виділити два:
1.
2.
створення нового файлу для запису всіх даних або початкової
структури даних
відкриття існуючого файлу з уже наявною структурою даних
для читання, запису і додавання.
Останній режим найбільш точно відповідає моделі
двійкового файлу як необмежено розширюється прямо
адресується масиву байтів.
// Відкрити існуючий як двійковий для читання і запису
FILE * fd; fd = fopen ( "a.dat", "rb + wb");
// Створити новий як двійковий для запису і читання
fd = fopen ( "a.dat", "wb +");
34

35.

ДАМП ДВІЙКОВОГО ФАЙЛУ
35

36.

ДАМП ДВІЙКОВОГО ФАЙЛУ
// Формування дампи для читання файлу
void main () {
FILE * fd = fopen ( "94-00.dat", "wb");
char k = 10, m = 4;
short A [10] = {6,3,7,3,4,8,300,5,23,64};
int B [4] = {6,3,7,3};
long p = 0, offset;
fwrite (& p, sizeof (long), 1, fd); // Зайняти місце під вказівник
fwrite (& k, 1,1, fd); // Записати один байт - лічильник
fwrite (A, sizeof (short), k, fd); // Записати масив коротких цілих (2B)
p = ftell (fd); // Отримати значення вазівника
fwrite (& m, 1,1, fd); // Записати один байт - лічильник
fwrite (B, sizeof (int), m, fd); // Записати масив цілих
fseek (fd, 0, SEEK_SET); // До початку файлу
fwrite (& p, sizeof (long), 1, fd); // Оновити вказівник на другий масив36
fclose (fd);
}

37.

ДАМП ДВІЙКОВОГО ФАЙЛУ
Щоб тепер «побачити» в дампі то, що ми записали, потрібно врахувати
наступне:
1.
2.
3.
4.
5.
Дамп виводиться побайтно, один байт представлений двома
шестнадцатерічнимі цифрами;
В кожному рядку дампа - 16 байтів. Зліва знаходиться адресу
рядки (природно, шістнадцятковий). На малюнку для
зручності позначена молодша цифра адреси кожного байта;
Всі дані пишуться «молодшими байтами вперед». Тобто для
отримання значення машинного слова байти треба
переписати в зворотному порядку;
Абсолютний адреса другого масиву, що знаходиться на
початку файлу має розмірність long (4 байта в даній версії
компілятора). Його шестнадцатеричное вміст потрібно
безпосередньо використовувати для пошуку адресується
області в дампі;
Для даних іншого типу необхідний переклад в десяткову 37
систему числення, а також облік їх розмірності відповідно до
їх типом.

38.

СПОСОБИ ОРГАНІЗАЦІЇ ДАНИХ У ФАЙЛІ
Мова не йде про перелік технологічних прийомів, використовуваних
при розміщенні даних. Будь-який конкретний формат може
використовувати одночасно кілька з них. Крім того, дані можуть
розміщуватися і в декількох файлах, а між ними - встановлюватися
взаємні посилання.
Запропонована класифікація базується на відмінності способів доступу
до даних. Фактично питання зводиться до способу отримання їх адреси.
Їх відомо кілька:
1. Дані витягуються з послідовного файлу в заданому форматі, тому їх
адресація не потрібно. Послідовні файли можуть містити записи як
фіксованою, так і змінної довжини, в т.ч. рядки тексту, а також будьякі дані в послідовному саморазворачівающемся форматі;
2. Адреса обчислюється, виходячи з кількості і розмірності змінних.
Сюди відносяться масиви і більш складні табличні структури даних,
розмірності яких зберігаються в них самих (параметризація).
3. Адреса міститься в іншій частині структури даних, тобто
використовується вказівник в файлі. Вказівник може
використовуватися і епізодично як адреса (зсув) до області даних,38
так і для підтримання регулярного структур даних, таких
як масиви вказівників, списки і дерева.

39.

СПОСОБИ ОРГАНІЗАЦІЇ ДАНИХ У ФАЙЛІ
39

40.

ПРИКЛАДИ
Зазвичай в двійкових файлах зберігають якісь певні структури
даних.
Найчастіше робота з бінарними файлами відбувається так.
#include <fstream>
using namespace std;
int main () {
const char * FName = "C:\\FromC\\1.txt";
int x = 100;
double y = 5.988;
/ * РОБОТА З бінарних файлів * /
ofstream out (FName, ios :: binary);
// Ставимо режим "бінарний файл"
out.write ((char *) & x, sizeof (x));
// Записуємо в файл значення "x"
out.write ((char *) & y, sizeof (y));
// Записуємо в файл значення "y"
out.close (); // Зберігаємо файл
/ * КІНЕЦЬ РОБОТИ З бінарних файлів * /
}
40

41.

ПРИКЛАДИ
Щоб ми могли записати якесь значення в бінарному представленні, нам
потрібно для початку вивести бінарне представлення, а щоб записалося
правильну кількість байт, потрібно явно вказувати цю кількість.
Це виглядає приблизно наступним чином:
(char*)&x
робимо рядок байтів для того, щоб віддати потоку,
відкритого в двійковому режимі
sizeof (x)
обмежуємо кількість йдуть в потік байтів потрібною
кількістю
41

42.

ПРИКЛАДИ
#include <fstream>
#include <iostream>
using namespace std;
int main () {
const char * FName = "C: \\ FromC \\ 1.txt"; //Шлях до файлу
int x = 0;
double y = 0;
/ * ПОЧАТОК РОБОТИ З ФАЙЛОМ * /
ifstream in (FName, ios :: binary);
in.read ((char *) & x, sizeof (x)); // перенесення байтів з файлу в "х"
in.read ((char *) & y, sizeof (y)); // перенесення байтів з файлу в "y"
in.close ();
/ * КІНЕЦЬ РОБОТИ З ФАЙЛОМ * /
}
cout << x << '\ n' << y << '\ n';
cin.get ();
42

43.

ПРИКЛАДИ
1.
2.
Для того, щоб простіше було працювати з бінарними файлами, треба
пам'ятати:
Виводите рядок байтів
Слідкуйте за розмірами
#include <fstream>
#include <iostream>
using namespace std;
int main () {
const char * FName = "C:\\MyFiles\\text.txt"; //Шлях до файлу
char S [255] = {}; // Символьний масив в 255 символів
/ * ПОЧАТОК РОБОТИ З ФАЙЛОМ * /
ifstream in (FName, ios :: binary);
in.read ((char *) & S, sizeof (S)); // перенесення байтів з файлу в "х"
//in.read((char*)S, sizeof (S));
// у випадку з масивом можна і так
in.close ();
/ * КІНЕЦЬ РОБОТИ З ФАЙЛОМ * /
cout << S << '\ n';
cin.get ();
}
43

44.

Дякую за увагу!
44
English     Русский Rules