Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Краткие теоретические сведения
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое. Прежде чем работать с файлом, его нужно открыть для доступа, т.е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т.д. В языке С это выполняет функция fopen(). Она связывает физический файл на носителе с логическим именем в программе. Логическое имя – это указатель на файл, т.е. на область памяти, где хранится информация о файле. Указатели на файлы необходимо объявлять. Формат объявления такого указателя следующий: FILE *указатель на файл; Формат объявления функции fopen( “строка_1” , “строка_2” ); в строке_1 (заключенной в кавычки) указывается место, в которое вы собираетесь поместить файл, например “a:mas_dat.dat” – файл с именем mas_dat.dat будет находиться на дискете (а:), “d:\\work\\sved.txt” – файл с именем sved.txt будет находиться на d:, в каталоге work. В строке_2 указываются коды режимов доступа к открываемым файлам: w - файл открывается только для записи; если файла с заданным именем нет, то он будет создан, если же такой файл существует, то перед открытием прежняя информация уничтожается; r - файл открывается только для чтения; если такого файла нет, то возникает ошибка; a - файл открывается для добавления в конец новой информации; r+ - файл открывается для редактирования данных; возможны и запись, и чтение информации; w+ - то же, что и для r+; a+ - то же, что и для a, только запись можно выполнять в любое место файла; доступно и чтение файла; t - файл открывается в текстовом режиме; указывается поле r, w, a, r+, w+, a+ ; b - файл открывается в двоичном режиме; указывается поле r, w, a, r+, w+, a+ . Текстовый режим отличается от двоичного тем, что при открытии файла как текстового пара символов «перевод строки», «возврат каретки» заменяется на один символ: «перевод строки» для всех функций записи данных в файл, а для всех функций вывода символ «перевод строки» теперь заменяется на два символа: «перевод строки», «возврат каретки». По умолчанию файл открывается в текстовом режиме. Пример: FILE *f; f=fopen("d:\\work\\Dat_sp.cpp", "w"); или FILE *f=fopen("d:\\work\\Dat_sp.cpp", "w"); - открывается для записи текстовый файл Dat_sp.cpp с указателем f, который будет находиться на диске d, в каталоге work. Если при открытии файла произошла ошибка, функция fopen() возвращает значение NULL. Приведем пример стандартной последовательности операторов, необходимых для корректной работы с файлом: #include <stdio.h> . . . FILE *f_my; If(!(f_my = fopen(“rez.txt”, “r+t”))) { puts(“\n Ошибка при открытии файла!”); getch(); return; } . . . // Работа с файлом fclose(f_my); . . .
После работы доступ к файлу необходимо закрыть с помощью функции fclose(указатель_на_файл). Например, из предыдущего примера файл закрывается так: fclose (f); Для закрытия нескольких файлов введена функция, объявленная следующим образом: void fcloseall(void); Для работы с текстовыми файлами удобнее всего пользоваться функциями fprintf(), fscanf(). Формат параметров и выполняемые функции аналогичны известным операторам форматного ввода-вывода, только добавлен параметр – указатель на файл, к которому применяется данная функция. Рассмотрим простой пример: #include<stdio.h> void main() { int a=2,b=3; FILE *f1; if(!(f1=fopen(“d:\\work\\f_rez.txt”,”w+t”))) { puts(“\n Файл не создан!”); getch(); return; } fprintf(f1,” Файл результатов \n”); fprintf(f1,” %d плюс %d = %d\n”,a,b,a+b); fclose(f1); } Просмотрев содержимое файла, можно убедиться, что данные в нем располагаются так же, как на экране при использовании функции printf(). Функция int fgets(char *S,int m,FILE *fp) – выполняет чтение строки S из файла fp до тех пор, пока не встретит символ '\n' или пока не будет считано m байт. Функция int fputs(char *S, FILE *fp) - записывает строку S в файл fp до тех пор, пока не встретится '\0', который в файл не переносится и на символ '\n' не заменяется. Функции работы с текстовыми файлами удобны при создании результирующих файлов для отчетов по лабораторным и курсовым работам. Для создания баз данных удобнее пользоваться функциями работы с бинарными файлами. В основном прототипы этих функций описаны в библиотеках stdio.hиio.h. Рассмотрим некоторые из них: 1) int fread(void *ptv, int size, int n, FILE *fp) - считывает n блоков по size байт каждый из файла fp в область памяти, на которую указывает ptv (необходимо заранее отвести память под считываемый блок); 2) int fwrite(void *ptv, int size, int n, FILE *fp) - записывает n блоков по size байт каждый из области памяти, на которую указывает ptv в файл fp; 3) int fileno(указатель_файла) – возвращает дескриптор файла (число, определяющее номер файла); 4) long filelength(int дескриптор_файла) – возвращает длину файла в байтах; 5) int chsize(int дескриптор_файла, long позиция) – выполняет изменение размера файла, признак конца файла устанавливается после байта с номером «позиция»; 6) intfseek(указатель_файла, long количество_байт, int код) – выполняет смещение указателя на количество_байт в направлении признака код: 0 - от начала файла; 1 - от текущей позиции указателя; 2 - от конца файла; 7) long ftell(указатель_файла) - возвращает значение указателя на текущую позицию файла (-1 – ошибка); 8) intfeof(указатель_файла) – возвращает ненулевое значение при правильной записи признака конца файла; 9) intfgetpos(указатель_файла,long*текущая_позиция) – определяет значение текущей позиции файла; возвращает 0 при успешном завершении.
Пример программы работы с файлом структур Создать файл, содержащий сведения о студентах: фамилия, три оценки, средний бал. Организовать возможность просмотра содержимого файла и добавления новых данных в конец файла.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h>
struct Sved { char Fam[20]; int mark[3]; float S_Bal; } zap; char Spis[]="d:\\work\\Sp.dat"; FILE *F_zap;
void main () { int i,kodR,size=sizeof(Sved); float s; clrscr(); while(1) { puts(" Создание - 1"); puts(" Просмотр - 2"); puts(" Добавление - 3"); puts(" Выход - 0"); scanf(“%d”, &kodR); switch(kodR) { case 1: case 3: if(kodR==1) F_zap=fopen(Spis,"w+b"); else F_zap=fopen(Spis,"a+b"); while(2) { puts(" Фамилия (Завершение ввода - 0)"); scanf(“%s”, zap.Fam); if((zap.Fam[0])=='0') break; puts(" Marks (3) "); for(s=0,i=0;i<3;i++) { scanf(“%d”, &zap.mark[i]); s+=zap.mark[i]; } zap.S_Bal=s/3.; fwrite(&zap,size,1,F_zap); } fclose(F_zap); break; case 2: F_zap=fopen(Spis,"r+b"); while(2) { if(size!=fread(&zap,1,size,F_zap)) break; /* Функция fread() возвращает количество прочитанных блоков, поэтому в данном случае 2-ой и 3-ий параметры функции переставлены местами */ printf(" %20s %2d %2d %2d %5.2f\n", zap.Fam,zap.mark[0],zap.mark[1],zap.mark[2],zap.S_Bal); } fclose(F_zap); break; case 0: return; } // Конец Switch } // Конец While(1) } // Конец программы
Варианты индивидуальных заданий Написать программу обработки файла типа запись, содержащую следующие пункты меню: - Создание, - Просмотр, - Коррекция – добавление новых данных или исправление старых.
1. Список товаров, имеющихся на складе, включает: - наименование товара; - количество единиц товара; - цену единицы товара; - дату поступления товара на склад. Вывести в алфавитном порядке список товаров, хранящихся более месяца, стоимость которых превышает 1000 рублей. 2. Для получения места в общежитии формируется список студентов, который включает: - Ф.И.О. студента; - номер группы (буква и четыре цифры); - средний балл; - доход на одного члена семьи. Общежитие в первую очередь предоставляется тем студентам, чьи доходы на члена семьи меньше двух минимальных зарплат, затем остальным в порядке уменьшения среднего балла. Вывести список очередности предоставления места в общежитии. 3. В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны: - номер рейса; - тип автобуса; - пункт назначения; - время отправления; - время прибытия на конечный пункт. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени. 4. На междугородной АТС информация о разговорах содержит: - дату разговора; - код и название города; - время разговора; - тариф; - номер телефона в этом городе; - номер телефона абонента. Вывести по каждому городу общее время разговора с ним и сумму. 5. Информация о сотрудниках фирмы включает: - Ф.И.О. сотрудников; - табельный номер; - количество проработанных часов за месяц; - почасовой тариф. Рабочее время свыше 144 ч считается сверхурочным и оплачивается в двойном размере. Вывести размер заработной платы каждого сотрудника фирмы за вычетом подоходного налога, который составляет 12% от суммы заработной платы. 6. Информация об участниках соревнований содержит: - Ф.И.О. игрока; - игровой номер; - возраст; - рост; - вес. Вывести информацию о самой молодой, рослой и легкой команде. 7. Для книг, хранящихся в библиотеке, задаются: - регистрационный номер книги; - автор; - название; - год издания; - издательство; - количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года. 8. Различные цеха завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают: - наименование; - количество; - номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества. 9. Информация о сотрудниках предприятия содержит: - Ф.И.О.; - номер отдела; - должность; - дату начала работы. Вывести список сотрудников по отделам в порядке убывания стажа. 10. Создать файл, содержащий сведения о месячной заработной плате сотрудников отдела. Каждая запись содержит поля: фамилия сотрудника, наименование отдела, размер заработной платы за месяц. Вычислить общую сумму выплат за месяц по отделу А, а также среднемесячный заработок сотрудникам этого отдела. Напечатать для бухгалтерии ведомость для сотрудников этого отдела, у которых зарплата ниже введенной с клавиатуры. 11. Создать файл, содержащий сведения о количестве изделий категории А, В, С, собранных рабочими за месяц. Структура записи имеет поля: фамилия сборщика, наименование цеха, количество изделий по категории, собранных рабочими за месяц. Считая данными (вводятся с клавиатуры) значения расценок Sa, Sв, Sc за выполненную работу по сборке единицы изделия категорий А, В, С, выдать на печать следующую информацию: - общее количество изделий категории А, В, С, собранных рабочими цеха X; - ведомость заработной платы рабочих цеха X; - средний размер заработной платы работников этого цеха. 12. Создать файл, содержащий сведения о телефонах абонентов. Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона. На печать вывести информацию: - по вводимой с клавиатуры фамилии абонента выдается номер телефона; - определяется количество установленных телефонов с XXXX года (год вводится с клавиатуры). 13. Создать файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например, от 2 до 5 лет. Вывести на печать: - название игрушек, которые подходят детям от 1 до 3 лет; - стоимость самой дорогой игрушки и ее наименование; - название игрушки, которая по стоимости не превышает «х» р. Значение «х» вводится с клавиатуры. 14. Создать файл, содержащий сведения о сдаче студентами сессии. Структура записи: номер группы, фамилия студента, оценки по пяти экзаменам и пяти зачетам (зачет – незачет). На печать вывести: - фамилии неуспевающих студентов с указанием номера группы и количества задолженностей; - средний балл, полученный каждым студентом группы Х (вводится с клавиатуры), и всей группой в целом. 15. Создать файл, содержащий сведения об ассортименте обуви в магазине. Структура записи: артикул, наименование, количество, стоимость одной пары. Артикул начинается с буквы Д для женской обуви, М -для мужской, П - для детской. На печать вывести информацию: - о наличии и стоимости обуви артикула Х (вводится с клавиатуры); - ассортиментный список женской обуви с указанием наименования и имеющего в наличии числа пар каждой модели. 16. Для участия в конкурсе исполнителей необходимо заполнить анкету с данными: - Ф.И.О; - год рождения; - название страны; - класс музыкального инструмента (гитара, фортепиано, скрипка). Вывести список самых молодых лауреатов конкурса по классам инструментов в порядке занятых мест.
Контрольные вопросы
1. Укажите правила открытия, закрытия файла в языке С. 2. Какие режимы доступа к файлам вы знаете? 3. Опишите работу функций fprintf() и fscanf(). 4. Опишите работу функций fwrite() и fread(). ЛАБОРАТОРНАЯ РАБОТА № 8
|
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 226. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |