Int i,k; float sum; //k-количество искомых товаров, sum- их общая стоимость.

struct tov {char name[10]; float c; int kol;} t; //Объявление структуры t

struct tov mag[n]; //объявление массива структур mag[n]

char nazv[10]; //Наименование искомого товара

printf(“\n Введите информацию о товарах \n“);

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

{ printf("\n наименование , цена, количество : ");

scanf("%s%f%d",&t.name,&t.c,&t.kol);//Заполнение информацией структуры t

mag[i]=t; //Присвоение i-му элементу массива структуры t целиком

}

printf("\n введите искомый товар: ");

scanf("%s",&nazv);

for (i=0,sum=0,k=0;i<n;i++)

if (strcmp(mag[i].name,nazv)==0)

{ sum+=mag[i].c*mag[i].kol;

k++;

}

printf("Товаров %s %d, их стоимость %5.2f ",nazv,k, sum);

getch();

}

Файл - это упорядоченная последовательность однотипных компонентов, расположенных на внешнем носителе. Файлы предназначены только для хранения информации, а обработка этой информации осу­ществляется программами. Использование файлов целесообразно в случае:

n долговременного хранения данных;

n доступа различных программ к одним и тем же данным;

n обработки больших массивов данных, которые невозможно целиком разместить в оперативной памяти компьютера.

Файл, не содержащий ни одного элемента, называется пустым. Создается файл путем добавления новых записей в конец первоначально пустого файла. Длина файла, т.е. количество элементов, не задается при определении файла. При вводе и выводе данные рассматриваются как поток байтов. Физически поток – это файл или устройство (клавиатура или дисплей). В Си поток можно открыть для чтения и/или записи в текстовом или бинарном (двоичном) режиме. В текстовых файлах не употребляются первые 31 символ кодовой таблицы ASCII (управляющие), а символы конца строки 0x13 (возврат каретки, CR) и 0x10 (перевод строки LF) преобразуются при вводе в одиночный символ перевода строки \n (при выводе выполняется обратное преобразование). Эти символы добавляются в конце каждой строки, записываемой в текстовый файл. При обнаружении в текстовом файле символа с кодом 26 (0x26), т.е. признака конца файла, чтение файла в текстовом режиме заканчивается, хотя файл может иметь продолжение.

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

Функция открытия потока fopen возвращает указатель на предопределенную структуру типа FILE (содержащую всю необходимую для работы с потоком информацию) при успешном открытии потока, или NULL в противном случае.

В заголовочном файле stdio.h содержится описание файлового типа FILE, с которым связывается файловая переменная (указатель на файл). При открытии файла указатель на файл связывается с конкретным файлом на диске и определяется режим открытия файла:

r (r+) - файл открывается для чтения (чтения и записи);

w (w+) - открывается пустой файл для записи (чтения и записи). Если файл с таким именем существует, он стирается;

a (а+)- файл открывается для дополнения в конец (чтения и дополнения).

Режим открытия может также содержать символы t (текстовый файл) и b (двоичный файл), указывающий на вид открываемого файла: rb, wb, ab, rt, at, rb+, wb+, ab+ и т.д.

Закрытие файла (текстового или бинарного) выполняется функцией fclose(), установка указателя на начало файла - функцией rewind(). Если при попытке чтения данных из файла встречается символ конца файла, то возвращается специальное значение EOF. Функции feof(),ferror() сообщают о причинах, по которым операция ввода/вывода не выполнилась.

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

Бинарные файлы могут содержать любую информацию. Чаще всего используются файлы, содержащие структуры. Для чтения и записи в бинарные файлы можно использовать функции fread(), fwrite() или fscanf(),fprintf().

fread –функция для чтения из файла:

int fread(void *ptr, unsigned size, unsigned count, FILE *f);

Из файла f считываются и по адресу ptr записываются count элементов размером size каждый. Функция возвращает число фактически считанных элементов.

fwrite – функция для записи в файл:

int fwrite(void *ptr, unsigned size, unsigned count, FILE *f);

В файл записываются, начиная с адреса ptr, count элементов размером size каждый. Функция возвращает число фактически записанных элементов.

fseek – функция для произвольного доступа к байтам бинарных файлов:

int fseek(FILE *f, long offset, int w);

offset показывает, на сколько байт нужно сместиться относительно точки отсчёта – w.

w должно быть равно одной из трех констант:

SEEK_SET или 0 - начало файла;

SEEK_CUR или 1 – текущая позиция в файле;

SEEK_END или 2 – конец файла.

ftell - возвращает текущую позицию в файле как длинное целое:

long int ftell (FILE *f);

Пример обработки бинарного файла

Составить программу, выполняющую следующие функции:

1. Создание нового файла;

2. Просмотр файла;

3. Добавление информации в конец файла;

4. Поиск по названию товара и изменение цены и количества;

Файл создать из структур вида: название товара, его цена и количество.

Задание выполнить в отдельных функциях. Использовать меню для выбора функций.

//lab10_1

#include <stdio.h>

#include <conio.h>

#include <string.h>

struct tov {char name[10]; float c; int kol;} t1;

void input(FILE *); // создание нового файла

void print(FILE *); // просмотр файла

void app(FILE *); // добавление в файл

void find(FILE *); // поиск и изменение

main()

{ char c;

FILE *tf;

while (1)

{ clrscr();

puts(" 1 – новый файл");

puts(" 2 – просмотр файла");

puts(" 3 – добавление в файл");

puts(" 4 – поиск и изменение");

puts(" 0 - выход");

c=getch();

switch(c)

{ case '1':input(tf);break;

case '2':print(tf);break;

case '3':app(tf);break;

case '4':find(tf);break;

case '0':return 0;

default : puts(" неверный режим");

}

}

}

void input(FILE *tf)

{ char ch;

tf=fopen("file1.dat","wb"); // открытие бинарного файла для записи

clrscr();

printf("\n Ввод товаров\n");

do

{ printf("\n название: "); scanf("%s",&t1.name);

printf(" цена: "); scanf("%f",&t1.c);

printf(" количество: "); scanf("%d",&t1.kol);

fwrite(&t1,sizeof(t1),1,tf); // запись в файл одной структуры t1

printf("\n Закончить? y/n ");

ch=getch();

}

while (ch != 'y');

fclose(tf);

}

void print(FILE *tf)

{ int i;

clrscr();

tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения

i=1;

fread(&t1,sizeof(t1),1,tf); // чтение из файла одной структуры t1

while (!feof(tf))

{ printf("\n %3d tovar %10s cena %6.2f kolic %4d",i,t1.name,t1.c,t1.kol);

fread(&t1,sizeof(t1),1,tf);

i++;

}

getch();

}

void app(FILE *tf)

{ char ch;

tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления

clrscr();

printf("\n Ввод товаров \n");

do

{ printf("\n название: "); scanf("%s",&t1.name);

printf(" цена: "); scanf("%f",&t1.c);

printf(" количество: "); scanf("%d",&t1.kol);

fwrite(&t1,sizeof(t1),1,tf);

printf(" Закончить? y/n ");

ch=getch();

}

while (ch != 'y');

fclose(tf);

}

void find(FILE *tf)

{ char c,tov[10];

long int i;

tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи

clrscr();

puts(" Название искомого товара: ");

gets(tov);

fread(&t1,sizeof(t1),1,tf);

while (!feof(tf))

{ if (strcmp(t1.name,tov)==0)

{ printf(" tovar %10s cena %6.2f kolic %d",t1.name,t1.c,t1.kol);

printf("\n изменить? y/n ");

c=getch();

if (c=='y')

{ printf("\n количество: ");scanf("%d",&t1.kol);

printf("\n цена: ");scanf("%f",&t1.c);

i=sizeof(t1);

fseek(tf,-i,1); // возврат на sizeof(t1) байт назад

fwrite(&t1,sizeof(t1),1,tf); // запись изменённой структуры на прежнее место

}

}

fread(&t1,sizeof(t1),1,tf);

}

fclose(tf);

}

ВЫПОЛНЕНИЕ РАБОТЫ

3.1. Проанализировать приведенную программу.

3.2. Используя функции и режим меню, создать файл из 10 записей, просмотреть файл, добавить в файл новую информацию и, при­меняя режим прямого доступа, выполнить задание по своему варианту.

Варианты заданий

1. Запись имеет вид: фамилия, пол, год рождения и рост. Вывести данные о самом высоком спортсмене.

2. Запись имеет вид: название вуза, число студентов, количес­тво факультетов. Добавить в конец файла информацию о трех новых вузах и посчитать общее число студентов.

3. Запись имеет вид: название издания, газеты или журнала, стоимость одного экземпляра, количество экземпляров в год. Вывести на печать информацию о самом дешевом издании.

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

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

6. Запись имеет вид: фамилия, номер телефона, дата рождения. Внести в начало списка информацию о четырех новых знакомых.

7. Запись имеет вид: название инструмента, число, месяц и год изготовления. Вывести на печать информацию об инструменте с самым большим сроком использования и выполнить корректировку этой записи.

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

9. Запись имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков.

10. Запись имеет вид: фамилия, количество вещей, общий вес. Удалите из файла сведения о багаже, общий вес вещей в котором меньше, чем 10 кг.

11. Запись имеет вид: название команды, количество набранных очков, фамилии капитанов. Вывести на печать список в порядке набранных мест.

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

* При обмене введите промежуточную переменную типа структура.

КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Чем отличается файл от массива?

2. Что понимается под чтением, и что под записью в файл?

3. Режимы доступа к файлам.

4. Назначение функций fseek, ftell.

Привести пример корректировки К-той записи в файле прямого доступа

Наши рекомендации