Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по С++.doc
Скачиваний:
34
Добавлен:
15.12.2018
Размер:
2.31 Mб
Скачать

Лекция 17 Файлы

Цели:

  • освоить методику написания алгоритмов с использованием файлов, перевода таких алгоритмов на язык программирования С++ и разработки соответствующего проекта в среде Visual C++ 6.0.

Работу с файлами можно сравнить с работой с массивами. Главное преимущество файлов перед массивами заключается в том, что массивы хранятся в ОП и информация исчезает с завершением работы программы, а информация, хранящаяся в файлах, может храниться нужное время на каком-либо носителе. Основной задачей, которая предполагает использование файлов, является обработка и хранение большого объёма информации. Когда происходит обработка информации из файла, программа часто обращается к файлу, следовательно, и к некоторой области жёсткого диска, что может нанести вред поверхности жёсткого диска. Поэтому нужно, определив размер файла, выделить динамическую память, в которую затем записать информацию из файла, обработать эту информацию и переписать обработанную информацию в файл. Для хранения и обработки информации из файла используют динамический массив структур и динамические структуры – списки, стеки, очереди.

Пример. Каждого студента можно описать при помощи следующих характеристик: ФИО, курс, специальность, предмет1, предмет2, предмет3. Написать программу (с использованием файлов), определяющую количество студентов:

  1. сдавших сессию на «отлично»;

  2. не сдавших хотя бы 1 экзамен.

Ход выполнения работы

  1. Алгоритм должен быть универсальным с точки зрения пользователя. Это означает, что он должен давать возможность не только определять указанные в задаче характеристики, но и предлагать пользователю вводить данные в файл, добавлять в конец файла новую порцию информации и читать информацию из файла. Для достижения этих целей при написании программы воспользуемся оператором выбора switch(). При этом работа с файлом будет осуществляться не напрямую, а через динамический массив структур. Для ввода-вывода значений будут использоваться потоковые функции.

  2. Написать программу, соответствующую алгоритму:

Алгоритм

Программа

структурный_тип stud

{

сhar fio[30];

int kurs;

сhar spec[30];

int hist;

int math;

int phis;

};

объявление stud *st, FILE *pf; цел: var, n, i, count_5, count_2;

var=0

пока var!=0

ввод var

выбор var

случай 1: // создание и

// запись в файл

ввод n

выделение динамической

памяти под указатель st

для i=0 до n-1 шаг 1

заполнить каждое поле

элемента массива

структур отдельно

все_для i

открыть файл pf в режиме

записи

записать в файл pf массив st

закрыть файл

освободить выделенную

динамическую память под

указатель st

выход

случай 2: //открытие файла

// для добавления

ввод n

выделение динамической

памяти под указатель st

для i=0 до n-1 шаг 1

заполнить каждое поле

элемента массива

структур отдельно

все_для i

открыть файл pf в режиме

добавления

дозаписать в файл pf

массив st

закрыть файл

освободить выделенную

динамическую

память под указатель st

выход

случай 3: // открытие файл в

// режиме чтения

//определение

// характеристик

открыть файл pf в режиме

чтения

определить длину файла n

выделение динамической

памяти под указатель st

заполнить массив st из

файла pf

count_5=count_2=0

для i=0 до n-1 шаг 1

//определяем

//количество отличников

если sti–>hist= =5 &&

sti–>math= =5 &&

sti–>phis= =5

count_5++;

все_если

//определяем количество

// студентов, не

//сдавших хотя бы один

//экзамен

если sti–>hist= =2||

sti–>math= =2||

sti–>phis= =2

count_2++;

все_если

все_если

все_для i

закрыть файл

освободить выделенную

динамическую память под

указатель st

печать count_5;

печать count_2;

выход

все_выбор

все_цикл

#include "stdio.h"

#include "stdlib.h"

#include "iostream.h"

#include "iomanip.h"

typedef struct

{

char fio[30];

int kurs;

char spec[30];

int hist;

int math;

int phis;

} stud;

int main()

{

stud *st;

FILE *pf;

int var, i, count_5, count_2;

long int n;

var=-1;

while(var!=0)

{

cout<<"0–выход; 1–запись; "

<<"2–добавление;"

<<"3–характеристики: var=";

cin>>var;

switch(var)

{

case 1:

cout<<"n="; cin>>n;

st=(stud*)malloc(n*sizeof(stud));

//заполнение массива структур

for(i=0;i<=n-1;i++)

{

cout<<"fio="; cin>>((st+i)–>fio);

cout<<"kurs="; cin>>((st+i)–>kurs);

cout<<"spec="; cin>>((st+i)–>spec);

cout<<"history=";cin>>((st+i)–>hist);

cout<<"math="; cin>>((st+i)–>math);

cout<<"phis="; cin>>((st+i)–>phis);

}

//файл открывается для записи данных

if((pf=fopen("my_f.dat","w”))==NULL)

{

printf("файл не открыт\n"); break;

}

//запись в файл

fwrite(st, sizeof(stud), n, pf);

fclose(pf);

free(st);

break;

case 2:

cout<<"n=";

cin>>n;

st=(stud*)malloc(n*sizeof(stud));

//заполнение массива структур

for(i=0;i<=n-1;i++)

{

cout<<"fio="; cin>>((st+i)–>fio);

cout<<"kurs="; cin>>((st+i)–>kurs);

cout<<"spec="; cin>>((st+i)–>spec);

cout<<"history=";cin>>((st+i)–>hist);

cout<<"math=";cin>>((st+i)–>math);

cout<<"phis="; cin>>((st+i)–>phis);

}

//файл открывается для добавления

if((pf=fopen("my_f.dat","a”))==NULL)

{

printf("файл не открыт\n"); break;

}

//дозапись в файл

fwrite(st, sizeof(stud), n, pf);

fclose(pf);

free(st);

break;

case 3:

//файл открывается для чтения

if((pf=fopen("my_f.dat","r”))==NULL)

{

printf("файл не открыт\n"); break;

}

//определение длины файла в байтах

fseek(pf, 0, SEEK_END);

n=ftell(pf);

//n – количества записей в файле

n=n/sizeof(stud);

st=(stud*)malloc(n*sizeof(stud));

rewind(pf);

//заполнение массива структур

fread(st, sizeof(stud), n, pf);

count_5=count_2=0;

for (i=0;i<=n-1;i++)

{ //количество отличников

if((st+i)–>hist= =5&&

(st+i)–>math= =5&&

(st+i)–>phis= =5)

count_5++;

//количество студентов, не

//сдавших хотя бы один экзамен

if((st+i)–>hist= =2||

(st+i)–>math= =2||

(st+i)–>phis= =2)

count_2++;

}

cout<<"count_5="<<count_5<<endl;

cout<<"count_2="<<count_2<<endl;

fclose(pf);

free(st);

break;

}

}return 1;

}

Примечание. Записью в файле называется блок данных, хранящихся в одной структуре, т.е. порция информации об одном студенте (в данном примере).

  1. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.