Використання файлів

Приклад 10.1. Створити файл на диску і записати до нього масив чисел. Прочитати цей файл і вивести його компоненти на екран.

// Р10_1.СРР — создание файла и запись в него массива

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

void main()

{ int i, mas[5];

//------------------------------- запись элементов массива в файл:

ofstream fout("massiv.dat"); /* создание потока fout и открытие файла с именем massiv.dat для записи */

if (! fout) cout <<"Cannot open file\n";

for (i = 0; і <5; i++)

{ 

cout << " Enter "<< і << " element\n";

cin >> mas[i];             // ввод элемента массива с клавиатуры

fout << mas[i] << " ";                //запись элемента в файл

}

fout.close();

//--------------------- чтение компонентов файла и вывод на экран

ifstream fin("massiv.dat"); //создание потока fin для чтения файла

if (!fin) cout << " Cannot open file fo reading\n";

cout « "REZULTAT\n";

for (i = 0; і <5; i++)

{

fin >> mas[i];

//чтение очередного элемента массива из файла

cout << "mas[" << і << "]=" << mas[i] << " ";

}

cout << "\nFile reading\n";

fin.close();

getch();

}

 

Результат розв’язання прикладу має вигляд:

Enter 0 element

15

Enter 1 element

20

Enter 2 element

125

Enter 3 element

94

Enter 4 element

5

REZULTAT

mas[0]=15  mas[i]=20  mas[2]=125  mas[3]=94  mas [4]=5

File reading

Приклад 10.2. Записати у файл матрицю matr(2,4) поелементно за рядками, прочитати її з файла і вивести на екран.

// Р10_2.СРР — формирование файла из элементов матрицы

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

void main( ) 

{

int matr[2][4], i, j;

//----------------------------------- запись матрицы в файл

ofstream out("filemat", ios::out | ios::binary); // открытие файла

cout << "Input matricu 2x4;" << endl;

for (i = 0; i < 2; i++)

{

for (j = 0; j < 4; j++)

{

cin >> matr[i][j]; //ввод очередного елемента матрицы

out << matr[i][j] << " "; // запись в файл этого элемента

}

}

out.close();

//----------------------------------- чтение матрицы из файла

ifstream in("filemat", ios::in | ios::binary); // открытие файла

for (i = 0; i < 2; i++)

for (j = 0; j < 4; j++)

in >> matr[i][j]; // чтение из файла элемента матрицы

in.close();

//---------------------- вывод матрицы на экран

cout << "\nMatrix matr";

for (i = 0; i < 2; i++)

{

cout << endl;

for (j = 0; j<4; j++)

cout << matr[i][j] << " ";

}

getch();

Результат розв’язання прикладу:

Input matricu 2×4:

5 7 10 8

15 3 12 10

Matrix matr

5 7 10 8

15 3 12 10

У цій програмі спочатку елементи матриці з клавіатури вво­дились у пам’ять комп’ютера, потім кожен з них записувався у файл з ім’ям filemat. Для цього попередньо було створено по­тік out і відкрито файл на диску.

Потім було створено потік in для зчитування даних з файла в пам’ять комп’ютера, тобто до матриці matr[i][j]. Наприкінці програми матрицю виведено на екран.

Приклад 10.3. Записати у файл 5 прізвищ, потім прочитати їх і ви­вести на екран.

/* Р10_З.СРР — программа записи в файл и чтения из файла массива из 5 фамилий */

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

main()

{

char st[5][15];

int i;//----------------------------------- запись файла

ofstream fout("st_file.dat"); // открытие файла

if (!fout) cout << "Cannot open file\n";

for (i = 0; і <5; i++)

{

cout << " Vvedite " << (i+1) << " famil\n";

cin.getline(st[i],15); // ввод очередной фамилии

fout << st[i] << " //запись фамилии в файл

}

fout.close();//----------------------- чтение файла и вывод на экран

cout << "\nReading file\n\n";

ifstream fin("st_file.dat");

if (!fin)cout << "Cannot open file.dat\n";

for (і = 0; і < 5; i++)

{

fin.getline(st[i],15);

cout << st[i] << " ";

}

fin.close();

getch();

}

Результат роботи програми має вигляд:

Vvedite 1 famil

Avdeev N. M.

Vvedite 2 famil

Bobrov G. K.

Vvedite 3 famil

Rusakov A. U.

Vvedite 4 famil

Popov Т. K.

Vvedite 5 famil

Jasin H. D.

Reading file

Avdeev N.M.  Bobrov G.K.  Rusakov A.U.  Popov Т.К.  Jasin H.D.

У попередніх програмах запис даних у файл та їх читання з файла здійснювалось послідовно поелементно. Але записати або прочитати декілька даних (наприклад, масив чисел) можна однією операцією. Для цього використовують функції-члени відповідних класів, які мають вигляд:

in.write((char*)&p,sizeof(p)); — для запису даних у файл,

in.read((char*)&p,sizeof(p)); — для читання даних з файла,

де іn — ім’я потоку введення або виведення;

р — змінна будь-якого типу, якщо змінна р має тип char[ ], то операція її приведення не потрібна.

Приклад 10.4. Записати у файл масив mas[ ] однією операцією, по­тім прочитати цей файл теж однією операцією в масив masl[ ] і вивес­ти цей масив на екран.

// Р10_4.СРР — запись в файл одномерного массива одной операцией

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

const int n=5;

int main()

{

int i, mas1[n], mas[n]={10, 20, 30, 40, 51};

ofstream fout("file_digits.dat"); // открытие файла для записи данных

if (!fout) cout<<"Cannot open file\n";

fout.write((char*)&mas,sizeof(mas)); //запись массива в файл

fout.close();

ifstream fin("file digits.dat"); // открытие файла для чтения данных

if (!fin) cout<<"Cannot open file for reading\n";

fin.read((char*)&masl, sizeof(masl)); // чтение массива из файла

cout << "file reading\n";

//---------- вывод массива mas1[ ] на экран

for (і = 0; і < n; і++)

cout << masl[i] << ' ';

cout << endl;

fin.close();

getch();

}

Результат роботи програми має вигляд:

file reading 10 20 30 40 51

Розглянемо, наприклад, створення файла, в якому необ­хідно записати список прізвищ абонентів та їх телефони (дані типу структура), а потім за потреби виведення на екран або всього списку, або тільки потрібних прізвищ і відповідних но­мерів телефонів.

Приклад 10.5. Розробити програму, за допомогою якої здійсню­ється запис даних типу структура (список прізвищ абонентів та їх те­лефонів) у файл з ім’ям struct.dat.

/* Р10_5.СРР1 — программа записи в файл struct.dat данных типа структура — списка фамилий абонентов и их номеров телефонов */

#include <iostream.h>

#include <fstream.h>

#include <string.h>

#include <conio.h>

struct telefon

{char fio[15]; char tel[10];};

main()

{

int i;

telefon spis[5];

ofstream out("struct.dat");

if (!out) cout << "Cannot open file\n";

for (і = 0; і < 5; i++) {

cout << "Enter " << i+1 << "fio and telefon\n";

//---------------- ввод фамилии и телефона с клавиатуры

cin >> spis[i].fio;

cin >> spisf[i].tel;

//---------------- запись фамилии и телефона в файл

cout << spis[i].fio << " " << spis[i].tel << endl;

}

out.close();

getch ();

}

Результат роботи цієї програми такий:

  Enter 1 fio and telefon

Головко

34-67-89

Enter 2 fio and telefon

Назаренко

34-56-89

Enter 3 fio and telefon

Долбня

12-13-14

Enter 4 fio and telefon

Коваленко

45-67-13

Enter 5 fio and telefon

Шостак

34-44-54 

Приклад 10.6. Розробити програму читання файла (struct.dat), ство­реного у прикладі10.5, і виведення на екран за запитом користувача або списка прізвищ абонентів і їх телефонів, або тільки прізвища і но­мера телефону потрібного абонента.

/* Р10_6.СРР_1 — программа чтения из файла данных типаструктура — список фамилий абонентов и номеров телефонов */

#include <iostream.h>

#include <conio.h>

#include <fstream.h>

#include <string.h>

struct telefon

{char fio[15];char tel[10];};

main()

{

int i, p;

char name[15];

bool t;

telefon spis;

//--------------------------- открытие файла, созданного ранее

ifstream in("struct.dat");

if (!in) cout << "\nCannot open file fo reading\n";

//--------------------------- задание режима работы с файлом

cout << "Who make: reading list(1) or name(2)\n";

cin >> p;              //------ ввод 1-го или 2-го режима

if (p == 1)          //------ обработка 1-го режима

{

//чтение данных из файла «struct.dat»

while (in >> spis.fio >> spis.tel)

// вывод данных на экран

cout << spis.fio << " " << spis.tel << endl;

}

else if (p == 2) //------- обработка 2-го режима

{

t = true;

cout << "Enter name\n";

cin >> name; //--------- ввод фамилии

//-------------- цикл для чтения данных из файла

while (in >> spis.fio >> spis.tel)

if (strcmp(spis.fio,name) == 0)

{

//вывод фамилии и телефона

cout << spis.fio << " "<<spis.tel<<"\n";

t = false;

}

in.close();

if (t) cout <<"Name "<< name <<" is not\n";

}

getch();

}

Результат розв’язання програми для першого режиму її ро­боти, коли потрібно вивести усі дані з файла:

Who make: reading list(l) or name(2)

1

Головко 34-67-89

Назаренко 34-56-89

Долбня 12-13-14

Коваленко 45-67-13

Шостак 34-44-54

Результат розв’язання цієї програми для другого режиму роботи, коли необхідно вивести задане прізвище і телефон, має вигляд:

Who make: reading list(1) or name(2)

2

Enter name

Коваленко Коваленко 45-67-13

Функції wtrite() і read() зручно використовувати для орга­нізації прямого доступу до даних у файлі. Але для цього потріб­ні також функції-члени, які дозволяють переміщати покажчик потоку в будь-яке місце файла. Ці функції застосовуються при запису даних у файл та при їх читанні з файла і мають відпо­відно вигляд:

in.seekp(n, dir);

in.seekg(n, dir);

де in — ім’я відповідного потоку (введення або виведення);

n — параметр, що вказує кількість байт, на яку треба пе­ремістити покажчик потоку;

dir — необов’язковий параметр, що вказує на спосіб перемі­щення покажчика і приймає одне зі значень:

ios::beg — переміщення від початку файла;

ios::cur — переміщення від поточної позиції;

ios::end — переміщення від кінця файла.

Якщо параметр dir відсутній, то переміщення покажчика здійснюється з початку файла.

Розглянемо програму, в якій використовуються методи пря­мого доступу до даних у файлі.

Приклад 10.7. Записати у файл числову матрицю розміром 3×5, потім, користуючись засобами прямого доступу, прочитати з файла спо­чатку другий рядок, а потім перший.

// Р10 7.СРР — запись в файл числовой матрицы // чтение из файла второй и первой строк матрицы

#include <iostream.h>

#include<fstream.h>

#include <iomanip.h>

#include <conio.h>

const int n=3, m=5;

main()

{

int i, j, mas[m];

char fname[ ]="matr.dat";

ofstream fout(fhame);

if (!fout) cout << "Cannot open file\n";//---------- ввод и запись в файл строк матрицы

for( i= 0; і < n; i++)

{

cout << "Enter "<< і << "stroku\n";

for (j = 0; j<m; j++)

cin >> mas[j];

fout.write((char*) &mas, sizeof(mas));

}

fout.close();

ifstream fin(fname);

if (!fin)

cout << "Cannot open file for reading\n";

cout << "\nVivod 2 і 1 strok matrix\n\n";

//--------- чтение из файла и вывод 2-ой строки:

fin.seekg(i*sizeof(mas));

fin.read((char*) &mas, sizeof(mas));

for (j = 0; j<m;j++)

cout << setw(3) << mas[j];

cout << endl;

//--------чтение из файла и вывод 1-ой строки:

fin.seekg(O);

fin.read((char*)&mas, sizeof(mas));

for (j = 0; j < m; j++)

cout << setw(3) << mas[j];

cout << endl;

fin.close();

getch();

}

Результат роботи програми:

Enter Ostroku

12 3 4 15 0

Enter lstroku

5 6 17 8 10

Enter 2stroku

11 45 9 46 3

Vivod 2 і 1 strok matrix

5 6 17 8 10

12 3 4 15 0

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *