Ввод и вывод в языках C и C++. Работа с бинарным файлом

   
На этом шаге мы рассмотрим особенности работы с файлом такого типа.

   
Бинарные файлы, в отличие от потоковых, создаются в определенной логической структуре и поэтому должны читаться в переменную той же структуры. Пример программы приведен ниже,
результат работы программы показан на рисунке 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. Результат работы приложения

   
Пояснений требуют следующие моменты:

  • запись FILE.write ( (char *) &b[i] , sizeof (b[i] ) );. Здесь для записи используется функция буферизированного вывода write(), где первым аргументом является
    указатель на структуру, из которой мы должны записывать данные. Этот указатель равен адресу структуры, т. е. &b[i]. Но в потоке все данные хранятся побайтово, поэтому тип указателя
    равен char (здесь идет принудительное преобразование типа). Второй аргумент - длина записи, она определяется стандартной функцией sizeof();
  • system ("DEL BLOCK" ); - этой функцией удаляется рабочий файл;
  • особенности работы функции eof(). Эта функция определяет достижимость конца файла только после выполнения операции чтения, поэтому в тексте программы
    сначала идет чтение очередной записи из файла, а потом в цикле while() проверяется достижимость конца файла. Если этот цикл записать так:

    	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++.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий