Приклад 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