Студопедия

КАТЕГОРИИ:

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

Краткие теоретические сведения




Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки и пересылке как единое целое.

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

В языке С это выполняет функция 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; просмотров: 186.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...