Пример обработки бинарного файла
Составить программу, выполняющую следующие функции:
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. Запись имеет вид: марка видеомагнитофона, стоимость, количество. Напечатать информацию об имеющихся в продаже магнитофонах. При покупке их количество соответственно уменьшается. Предусмотреть удаление информации о видеомагнитофонах, количество которых равно нулю.
* При обмене введите промежуточную переменную типа структура.
КОНТРОЛЬНЫЕ ВОПРОСЫ
4.1. Режимы доступа к файлам.
4.2. Назначение функций fseek, ftell.
4.3. Можно ли взаимозаменять функции fscanf и fread; fprint и fwrite ?
4.4. Привести пример корректировки К-той записи в файле прямого доступа.
Лабораторная работа № 11
Динамические массивы
1. ЦЕЛЬ РАБОТЫ:приобретение практических навыков создания и обработки одномерных и многомерных динамических массивов.
ОСНОВНЫЕ ПОНЯТИЯ
При определении статического массива: <тип> <имя_массива> [количество_элементов] , имя_массива становится указателем на область памяти, выделяемой для размещения элементов массива. Количество элементов должно быть константой. Таким образом, размеры памяти, выделяемой под массив, заданы в определении массива. Но иногда нужно, чтобы размеры памяти были не фиксированными, а выделялись в ходе выполнения программы при решении конкретной задачи.
Формирование массивов с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти. Эти средства описаны в файле <alloc.h>. Функции malloc() и calloc() динамически выделяют память в соответствии со значениями их параметров и возвращают адрес начала выделенного участка памяти. Тип возвращаемого значения указателя void *. Его можно преобразовать к указателю любого типа с помощью явного приведения типа. Функция free(void *) освобождает память, выделенную с помощью malloc() или calloc().
int *p;
p=(int *)malloc(size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером size байт.
p=(int *)calloc(n, size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером n*size байт.
free(p); //Освобождает выделенную по адресу p память. Преобразование указателя любого типа к типу void * осуществляется автоматически, так что в качестве фактического параметра можно подставить указатель любого типа без явного приведения типов.
Пример формирования одномерного динамического массива
//lab11_1
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
main()
{ float *p,d;
int i,n;
printf("\n input n:");
scanf("%d",&n);
p=(float *)malloc(n*sizeof(float));
for (i=0;i<n;i++)
{printf("x[%d]=",i);
scanf("%f",&d);
p[i]=d;
}
for (i=0;i<n;i++)
{ if (i%4==0) printf("\n");
printf("\t x[%d]=%6.2f",i,p[i]);
}
free(p);
getch();
}
Доступ к участкам выделенной памяти выполняется с помощью операции индексирования: p[i].
Каждый элемент массива может быть, в свою очередь, массивом. Именно так конструируются динамические многомерные массивы. Рассмотрим алгоритм создания и обработки двумерного массива.
1. Определяем указатель на массив указателей , задающий адреса начала строк матрицы: тип **uk.
2. Вводим размеры матрицы n,m.
3. Создаём динамический массив указателей на указатели начала строк : uk=(тип **)malloc(n*sizeof(тип *));
4. В цикле выделяем память под n массивов – строк по m элементов в каждом: for (i=0;i<n;i++) uk[i]=(тип *)malloc(m*sizeof(тип));
5. Обработка массива (работа с индексированными элементами uk[i][j]).
6. В цикле освобождаем память, занятую под n массивов – строк : for (i=0;i<n;i++) free(uk[i]);
7. Освобождаем память, занятую под массив указателей : free(uk).
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|