Приклад. Прочитати вміст файла, створеного в попередньому прикладі.
Прочитати вміст файла, створеного в попередньому прикладі.
#include <iostream.h>
#include <fstream.h>
void main()
{
long nZach;
char FIO[25];
ifstream Studfile("Student.dat");
if ( !Studfile)
cout<<"Файл не вдається відкрити")<<endl;
else
{
cout<<"Номер залікові книжки прізвище студента"<<endl;
while (Studfile >>nZach>> FIO)
cout<< nZach<<" "<<FIO<<endl;
Studfile.close();
}
}
Коли досягається кінець файлу, вхідна послідовність в операторі while повертає нуль.
Можна цикл читання з файлу записати інакше, використовуючи метод eof() для перевірки досягнення кінця файла:
while (!Studfile.eof())
{
Studfile >>nZach>> FIO;
cout<< nZach<<" "<<FIO<<endl;
}
Приклад діалогової програми з використанням файлів послідовного доступу
Створити файл, що містить відомості про студентів: номер залікової книжки, середній бал, ПІБ студента. Вивести дані про вказаного студента. Мати змогу доповнити файл і переглянути весь вміст.
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <string.h>
void vvod(int); // прототипи функцій
void vivod (void);
void vibor (void);
void main() // головна функція. Містить діалог
{
char d;
do
{
clrscr();
cout<<"1 -vvod"<<endl<<"2 - add"<<endl<<"3 - vivod"<<endl
<<"4 - vibor"<<endl<<"5 - exit"<<endl;
d=getch();
switch (d)
{
case '1':vvod(0);break;
case '2':vvod(1);break;
case '3':vivod();break;
case '4':vibor();break;
}
}
while (d!='5');
}
void vvod(int d)// функція для створення файлу і вводу в нього або доповнення
/*d = 0 для вводу
d = 1 для доповнення*/
{
long nZach;
char FIO[25];
float ball;
ofstream Studfile;
if (d==0)
Studfile.open("Student.dat");
else
Studfile.open("Student.dat",ios::app);
if ( !Studfile)
cout<<"Файл не вдається створити"<<endl;
else
{
cout<<"Введiть номер залiкової книжки, cepeднiй bal,прiзвище
студента"<<endl;
cout<<"Введiть ^z для завершення."<<endl;
while (cin>>nZach>>ball>>FIO)
{
Studfile<< nZach<<' '<<ball<<' '<<FIO<<endl;
cout<<"? ";
}
Studfile.close();
cin.clear(); // очистити потік стандартного вводу
}
}
void vivod(void) // функція виводу вмісту всього файлу
{
long nZach;
char FIO[25];
float ball;
ifstream iStudfile("Student.dat");
if ( !iStudfile)
cout<<"Файл не вдається вiдкрити"<<endl;
else
{
cout<<"Hомер залiкової книжки, cepeднiй бал,прiзвище студента"<<endl;
while (iStudfile>>nZach>>ball>>FIO)
cout<< nZach<<" "<<ball<<" "<<FIO<<endl;
getch();
iStudfile.close();
}
}
void vibor (void) // функція вивірки даних про вказаного студента
{
long nZach;
char FIO[25],vFIO[25];
float ball;
ifstream iStudfile("Student.dat");
if ( !iStudfile)
cout<<"Файл не вдається вiдкрити"<<endl;
else
{
cout<<"Введiть ФIО для пошуку"<<endl;
cin>>vFIO;
cout<<"Данi по студенту"<<endl;
while (iStudfile>>nZach>>ball>>FIO)
{
if (strcmp(vFIO,FIO)==0)
cout<< nZach<<" "<<ball<<endl;
}
iStudfile.close();
getch();
}
}
Робота з файлами довільного доступу
1) Основні відомості2) Створення і відкриття файлу прямого доступу3) Запис даних у файл4) Читання даних з файлу5) Доступ до довільного записуОсновні відомостіПри використанні файлів послідовного доступу неможливо прямо у файлі змінити якесь значення. Це приведе до спотворення інших даних. Найпростішим способом це зробити - використати допоміжний файл у який послідовно записати дані до запису, що змінюється, потім дані, що змінюється, а потім дані, що розміщуються за зміненими даними. Потім цей файл повинен замінити або бути скопійованим у висхідний файл. Це потребує додаткових ресурсів часу і не є вигідним. Спрощує завдання використання файлів з довільним доступом.С++ не накладає обмежень на структуру файлів. Тому додаток може сам створювати їх за своєю потребою для створення файлів довільного доступу може бути використано багато методів. Найбільш простим методом є вимога, щоб всі записи в файлі були однакової довжини. Це дає можливість легко визначати місцеположення потрібних даних. Тому при запису до файлу необхідно явно вказувати розмір даних. Найчастіше для роботи використовуються структури. Створення і відкриття файлу прямого доступуСтворення, відкриття для читання, відкриття для доповнення файлу прямого доступу нічим не відрізняється від цих дій для файлу послідовного доступу. Запис даних у файлДля запису даних до файлу прямого доступу використовується функція елемент write класу ofstream яка виводить у файл фіксовану кількість байтів, починаючи з вказаного місця пам‘яті у позицію файлу на яку вказує файловий вказівник.Формат запису
<ім‘я потоку>.write((char*)&<ім‘я змінної>,sizeof(<ім‘я змінної>));
Приклад формування нового файлу#include <iostream.h>
#include <fstream.h>
struct zStudent
{
char FIO[20];
char grupa[15];
int god_r;
};
void main()
{
zStudent stud;
ofstream outStud("Stud.dat");
if (!outStud)
cout<<"File not create!!!"<<endl;
else
while (!cin.eof())
{
cout<<"\nVvod FIO ";
cin>>stud.FIO;
cout<<"Vod grupa ";
cin>>stud.grupa;
cout<<"Vod god_r ";
cin>>stud.god_r;
outStud.write((char*)&stud,sizeof(stud));
}
outStud.close();
}
Приклад доповнення файлу#include <iostream.h>
#include <fstream.h>
struct zStudent
{
char FIO[20];
char grupa[15];
int god_r;
};
void main()
{
zStudent stud;
ofstream outStud("Stud.dat",ios::app);
if (!outStud)
cout<<"File not create!!!"<<endl;
else
while (!cin.eof())
{
cout<<"\nVvod FIO ";
cin>>stud.FIO;
cout<<"Vvod grupa ";
cin>>stud.grupa;
cout<<"Vvod god_r ";
cin>>stud.god_r;
outStud.write((char*)&stud,sizeof(stud));
}
outStud.close();
}
Читання даних з файлу Для читання даних з файлу прямого доступу використовується функція елемент read класу ifstream яка читає з файлу фіксовану кількість байтів, починаючи з позиції файлу на яку вказує файловий вказівник у вказане місце у пам‘яті.Формат читання
<ім‘я потоку>. read ((char*)&<ім‘я змінної>,sizeof(<ім‘я змінної>));
Приклад читання з файлу#include <iostream.h>
#include <fstream.h>
struct zStudent
{
char FIO[20];
char grupa[15];
int god_r;
};
void main()
{
zStudent stud;
ifstream inStud("Stud.dat");
if (!inStud)
cout<<"File not open!!!"<<endl;
else
while (!inStud.eof())
{
inStud.read((char*)&stud,sizeof(stud));
cout<<endl<<stud.FIO<<" "<<stud.grupa<<" "<<stud.god_r<<endl;
}
inStud.close();
}
Доступ до довільного запису Для доступу до довільного запису для виведення даних у файл використовується функція елемент seekp класу. При цьому, якщо файл був закритий, то його необхідно відкрити файл в режимі ios::ate (переміститись в кінець відкритого файлу). Якщо файл був відкритий для запису – ніяких дій для відкриття виконувати не потрібно.Для доступу до довільного запису для виведення даних у файл використовується функція елемент seekg класу.Формат доступу до запису:<ім‘я потоку>.seekp | seekg (<номер запису>*sizeof<ім‘я змінної>); Спочатку необхідно встановити файловий указник на необхідний запис, а потім виконати необхідні дії: читати або писати. Врахувати, що нумерація записів починається з нуля. Приклад зміни вмісту третього запису файлу#include <iostream.h>
#include <fstream.h>
struct zStudent
{
char FIO[20];
char grupa[15];
int god_r;
};
void main()
{
zStudent stud;
ofstream outStud("Stud.dat",ios::ate);
if (!outStud)
cout<<"File not create!!!"<<endl;
else
{
cout<<"\nVvod FIO ";
cin>>stud.FIO;
cout<<"Vvod grupa ";
cin>>stud.grupa;
cout<<"Vvod god_r ";
cin>>stud.god_r;
outStud.seekp(2*sizeof(stud));
outStud.write((char*)&stud,sizeof(stud));
}
outStud.close();
}
Приклад читання з файлу третього запису#include <iostream.h>
#include <fstream.h>
struct zStudent
{
char FIO[20];
char grupa[15];
int god_r;
};
void main()
{
zStudent stud;
ifstream inStud("Stud.dat");
if (!inStud)
cout<<"File not open!!!"<<endl;
else
{
inStud.seekg(2*sizeof(stud));
inStud.read((char*)&stud,sizeof(stud));
cout<<endl<<stud.FIO<<" "<<stud.grupa<<" "<<stud.god_r<<endl;
}
inStud.close();
}
Динамічний розподіл пам¢яті Пам¢ять може бути виділена і звільнена в процесі виконання програми. Для роботи з динамічною пам¢яттю використовуються оператори new i delete. Оператор new використовується для виділення пам¢яті. Формат оператора може бути представлено в двох формах:new <ім¢я типу> [(<значення для ініціалізації>)]new (<ім¢я типу>)[(<значення для ініціалізації>)] Оператор повертає указівку на об¢єкт вказаного типу.Якщо пам¢ять не може бути виділена, оператор повертає значення NULL.Наприклад: double *d; d=new double; або d=new(double);Коли виділяється пам¢ять, значення об¢єкту (значення записане в цій пам¢яті), буде не визначеним. Об¢єкту можна присвоїти початкове значення при використанні оператора new, наприклад d=new double (3.567); int* i=new int(12345);В якості аргументу можна використовувати стандартні типи і типи, визначені користувачем. При виділення пам¢яті для масиву оператор повертає указівку на перший елемент масиву. В цьому разі формат оператору має вигляд: new <ім¢я типу>[<розмір>] Наприклад:
int *n; n=new int[20];
Ініціалізувати значення елементів масиву не дозволяється.Для виділення динамічної пам¢яті для двовимірного масиву необхідно сформувати масив указівок на одновимірні масиви, тому що в С++ двовимірний масив розглядається як масив масивів. Наприклад, сформуємо динамічний масив розміром 2х2:
іnt **m; //указівка на указівку
m=new int*[2]; //указівка на масив
for(i=0;i<2;i++) //формування указівок на одновимірні масиви(рядки
матриці)
m[i]=new int[2];
Оператор delete використовується для звільнення пам¢яті, відведеної для об¢єкту.Оператор можна записати в двох формах: delete <ім¢я змінної стандартного типу>; delete []<ім¢я змінної масиву>;Наприклад: delete d; delete []n;Для двовимірного масиву необхідно спочатку звільнити пам¢ять, відведену для одновимірних масивів, а потім -- відведену для масиву вказівок.
for (i=0;i<2;i++)
delete[] m[i];
delete []m;
Приклад.Записати ціле значення в динамічну пам‘ять.
#include <iostream.h>
void main()
{
int* k=new int;
if (k!=NULL)
{
cout<<"vvod"<<endl;
cin>>*k;
cout<<"s= "<<*k<<endl;
delete k;
}
}
Приклад. Сформувати масив 10 цілих чисел. Знайти суму елементів масиву.
#include <iostream.h>
void main()
{ int і,s=0;
int* k=new int[10];
if (k!=NULL)
{
cout<<”Введіть 10 чисел”<<endl;
for(i=0;i<=9;i++)
cin>>k[i];
for(i=0;i<=9;i++)
s+=k[i];
cout<<"s= "<<s<<endl;
delete []k;
}
}
СИМВОЛИ ДАНИХ: | СИМВОЛИ ПРОЦЕСУ: | ||
Дані | Процес | ||
Дані, що запам'ято- вуються | Визначений процес | ||
ОЗП | Ручна операція | ||
ЗП з прямим доступом | Перевірка | ||
Документ | Паралельні дії | ||
Ручний ввід | Початок циклу | ||
Дісплей | Кінець циклу |
|
СИМВОЛИ ЛІНІЙ: | ПРАВИЛА ЗАСТОСУВАННЯ СИМВОЛІВ: | ||||
Передача керування | ххх | Використання ідентифікатора | |||
Канал зв'язку | хх..х | Використання опису | |||
| Альтернативний зв'язок | Докладне представлення | |||
СПЕЦІАЛЬНІ СИМВОЛИ: | З'єднання кількох ліній в одну | ||||
З 'єднувач | Зображення пересічних ліній | ||||
Ввід - вивід Коментарі | Внутрішній з'єднувач | ||||
. . . Пропуск | Зовнішній з'єднувач | ||||
Дата добавления: 2015-08-26; просмотров: 743;