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

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

#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;

}

}

 

ДОДАТОК А Інформаційний ПЕРЕЛІК ГРАФІЧНИХ СИМВОЛІВ


СИМВОЛИ ДАНИХ:

СИМВОЛИ ПРОЦЕСУ:
Дані Процес
Дані, що запам'ято- вуються Визначений процес
ОЗП Ручна операція
ЗП з прямим доступом Перевірка
Документ Паралельні дії
Ручний ввід Початок циклу
Дісплей Кінець циклу

Продовження додатку А

СИМВОЛИ ЛІНІЙ: ПРАВИЛА ЗАСТОСУВАННЯ СИМВОЛІВ:
Передача керування ххх Використання ідентифікатора
Канал зв'язку хх..х Використання опису
xb
__ __ __

Альтернативний зв'язок Докладне представлення
СПЕЦІАЛЬНІ СИМВОЛИ: З'єднання кількох ліній в одну
З 'єднувач Зображення пересічних ліній
Ввід - вивід Коментарі Внутрішній з'єднувач
. . . Пропуск Зовнішній з'єднувач
         

 








Дата добавления: 2015-08-26; просмотров: 735;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.059 сек.