Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Лекция 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; }

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

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.