Читайте также: |
|
Такі файли, на відміну від потокових, створюються в певній логічній структурі і тому повинні читатися в змінну тієї ж структури. Приклад програми приведений в лістингу 13.
лістинг 13
# include <vcl.h>
# include <iostream> / / для cin, cout
# include <fstream>
# include <conio.h>
# include <stdio.h>
void main ()
{
using namespace std; // використовується стандартне простір імен
/* Дані про співробітників */
struct Blocknotes
{
char name [30];
char phone [15];
int age;
} B [2] =
{
"
}; // Ініціалізація масиву структур
// Запис даних в файл
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 ();
}
Пояснень потребують такі моменти:
- для запису
FILE.write((char *)&b[i], sizeof(b[i]));
використовується функція буферізірованний виведення write (), в якій першим аргументом є вказівник на структуру, з якої ми повинні записувати дані. Цей вказівник дорівнює адресою структури, тобто & b [i]. Але в потоці всі дані зберігаються побайтно, тому тип вказівника char (тут йде примусове перетворення типу). Другий аргумент - довжина запису. Вона визначається стандартною функцією sizeof ();
- за допомогою функції system ("DEL BLOCK") вилучається робочий файл;
- оператор goto застосований для підстраховки від перевищення індексу масиву bb [].
Результат роботи програми наведений на рис. 3.
Рис. 3. Результат роботи програми лістингу 13
Стандартне введення/виведення в С++
Загальні положеняя
Стандартне введення/виведення є окремим випадком файлового введення/виведення. При файловому введенні/виведенні ми оголошували екземпляри відповідних поточних класів і потім користувалися методами і операціями << і >>. Але як ми бачили на початку цієї лекції, класи istream, ostream, що лежать в основі потокових класів, містять стандартні об'єкти-екземпляри класів з іменами cout (екземпляр класу для стандартного введення), cin (екземпляр класу для стандартного виведення) і сerr (екземпляр класу для стандартного виводу повідомлень про помилки). При запуску будь-якої програми на мові С++ ці стандартні потоки визначені (відкриті) і за замовчуванням призначені на стандартне ввідний пристрій - клавіатуру (cin), на стандартне вивідний пристрій - екран (cout і cerr). Причому всі ці пристрої синхронно пов'язані з відповідними вказівниками stdin, stdout, stderr. Так що робота зі стандартним введенням/виведенням зводиться до того, що замість імен примірників відповідних класів, що задаються користувачем, задаються імена стандартних екземплярів класів: cin, cout. Відкривати нічого не потрібно, треба тільки використовувати операції <<, >> і операції форматування. Якщо ми пишемо імена змінних, з яких виводяться або в які вводяться дані, то за замовчуванням для введення/виведення використовуються певні формати. Наприклад, запишемо:
cout << i;
У цьому випадку значення i виведеться на екран у форматі, визначеному за замовчуванням для типу i в мінімальному поле.
Запишемо:
cin >> i >> j >> s;
де i, j, s описані відповідно як int, float, char. У записі ми не бачимо форматів, але при введенні значень цих змінних з клавіатури (після введення кожного значення треба натискати клавішу <Enter>) їх формати будуть враховані.
Дата добавления: 2015-07-10; просмотров: 120 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Робота з класом ifstream | | | Стандартне виведення cout |