На этом шаге мы рассмотрим особенности работы с файлом такого типа.
Бинарные файлы, в отличие от потоковых, создаются в определенной логической структуре и поэтому должны читаться в переменную той же структуры. Пример программы приведен ниже, результат работы программы показан на рисунке 1.
// 93_1.cpp: главный файл проекта. #include "stdafx.h" #include <iostream> //for cin, cout #include <fstream> #include <conio.h> #include <stdio.h> #include <clocale> //обязательно для функции setlocale() using namespace System; using namespace std; // используется стандартное // пространство имен void main() { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы //данные о сотрудниках struct Blocknotes { char name[30]; char phone[15]; int age; } b[2] = { "Иванов", "123456", 45, "Петров", "456789", 50 }; //инициализация массива структур //запись данных в файл ofstream FILE; FILE.open("Block", ios::binary); for (int i=0; i<2; i++) FILE.write((char *)&b[i],sizeof(b[i])); FILE.close(); //чтение данных из файла ifstream FILE1; FILE1.open("Block", ios::binary); Blocknotes bb[2]; int i=0; FILE1.read((char *)&bb[i],sizeof(bb[i])); while(!FILE1.eof() ) { cout << "Строка " << i << ": " << bb[i].name << " " <<bb[i].phone << " " << bb[i].age << endl; i++; FILE1.read((char *)&bb[i],sizeof(bb[i])); } FILE1.close(); system("DEL BLOCK"); _getch(); }
Рис.1. Результат работы приложения
Пояснений требуют следующие моменты:
while(!FILE1.eof() ) { if ( i == 2 ) goto m; FILE1.read((char *)&bb[i],sizeof(bb[i])); cout << "Строка " << i << ": " << bb[i].name << " " <<bb[i].phone << " " << bb[i].age << endl; i++; } m: FILE1.close();
На следующем шаге мы начнем рассматривать стандартный ввод/вывод в C++.