Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Работа с бинарным файлом

Читайте также:
  1. g. Если работает на табачном проекте, в первую очередь спрашиваем, курит ли человек
  2. I. Историческая работа сообразно её материалам
  3. II. Групповая работа
  4. II. Историческая работа сообразно её формам 1 страница
  5. II. Историческая работа сообразно её формам 2 страница
  6. II. Историческая работа сообразно её формам 3 страница
  7. II. Историческая работа сообразно её формам 4 страница

Такие файлы, в отличие от потоковых, создаются в определенной логической структуре и поэтому должны читаться в переменную той же структуры. Пример программы приведен в листинге 9.14, результат работы программы показан на рис. 9.10.

Листинг 9.14

// 40.срр: Defines the entry point for the console application.

#include "stdafx.h"

#include <iostream> //for cin, cout

#include <fstream>

#include <conio.h>

#include <stdio.h>

void _tmain()

{

using namespace std; /*используется стандартное пространство имен*/

/*данные о сотрудниках*/

struct Blocknotes

{

char name[30];

char phone[15];

int age;

}b[2]={

"Smit", "123456", 45,

"Kolly", "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;

while(!FILE1.eof())

{

if(i==2)

goto m;

FILE1.read((char *)&bb[i], sizeof(bb[i]));

cout << "string" << i << " " << bb[i].name <<" " << bb[i].phone << " " << bb[i].age << endl;

i++;

}

m: FILE1. close ();

system("DEL BLOCK");

_getch();

}

Рис. 9.10. Результат работы программы листинга 9.14

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

¨ запись FILE.write((char *)&b[i], sizeof(b[i]));

Здесь для записи используется функция буферизированного вывода write(). где первым аргументом является указатель на структуру, из которой мы должны записывать данные. Этот указатель равен адресу структуры, т. е. &b[i]. Но в потоке все данные хранятся побайтно, поэтому тип указателя char (здесь идет принудительное преобразование типа). Второй аргумент— длина записи, она определяется стандартной функцией sizeof();

¨ system ("DEL BLOCK "); — этой функцией удаляется рабочий файл;

¨ оператор goto применен для подстраховки от превышения индекса массива bb[].

9.2.3 Стандартный ввод/вывод в C++

 

Общие положения

Стандартный ввод/вывод является частным случаем файлового ввода/вывода. При файловом вводе/выводе мы объявляли экземпляры соответствующих поточных классов, а затем пользовались методами и операциями: <<, >>. Но как мы видели в начале этой главы, классы istream, ostream, лежащие в основе поточных классов, содержат стандартные объекты-экземпляры классов с именами cout (экземпляр класса для стандартного ввода), cin (экземпляр класса для стандартного вывода) и сегг (экземпляр класса для стандартного вывода сообщений об ошибках).

При запуске любой программы на языке C++ эти стандартные потоки определены (открыты) и по умолчанию назначены на стандартное вводное устройство — клавиатуру (cin), на стандартное выводное устройство — экран (cout и сегг). Причем все эти устройства синхронно связаны с соответствующими указателями stdin, stdout, stderr. Так что работа со стандартным вводом/выводом сводится к тому, что вместо задаваемых пользователем имен экземпляров соответствующих классов задаются имена стандартных экземпляров классов: cin, cout. Открывать ничего не надо, надо только использовать операции <<, >> и операции форматирования. Если мы пишем имена переменных, из которых выводятся или в которые вводятся данные, то по умолчанию для ввода/вывода используются определенные форматы. Например, запишем:

cout << i;

В этом случае значение i выведется на экран в формате, определенном по умолчанию для типа i и в минимальном поле.

Запишем:

cin >> i >> j >> s;

где i, j, s описаны, соответственно, как int, float, char. В записи не видно форматов, но при вводе значений этих переменных с клавиатуры (после ввода каждого значения надо нажимать <Enter>) их форматы будут учтены.


Дата добавления: 2015-07-26; просмотров: 44 | Нарушение авторских прав


Читайте в этой же книге: Функции стандартного ввода/вывода | Примечание | Пространства имен | Работа с классом fstream |
<== предыдущая страница | следующая страница ==>
Работа с классом ifstream| Примечание

mybiblioteka.su - 2015-2024 год. (0.007 сек.)