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