Пиши Дома Нужные Работы

Обратная связь

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

 

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

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

- Просмотр файла;

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

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

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

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

 

#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 название %10s цена %6.2f колич. %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(" название %10s цена %6.2f колич. %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 * осуществляется автоматически, так что в качестве фактического параметра можно подставить указатель любого типа без явного приведения типов.

 






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2024 pdnr.ru Все права принадлежат авторам размещенных материалов.