Создать структуру и написать функцию, которая записывает в бинарный файл данные о сканере из структуры - C (СИ)
Формулировка задачи:
Сама структура имеет вид:
Структура файла: в первых 4-х байтах размещается значение типа long, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах.
Написать функцию, которая извлекает из этого файла данные о сканере в структуру типа scan_info. Обязательный параметр – номер требуемой записи. Функция должна возвращать нулевое значение, если чтение прошло успешно, и 1 – иначе.
Привести примеры программы, создающей файл с данными о сканерах (данные вводятся с клавиатуры) – 6-8 записей и выводящей на дисплей данные о запрошенной записи.
Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.
struct scan_info{
char model[25]; // наименование модели
int price; // цена
double x_size; // горизонтальный размер области сканирования
double y_size; // вертикальный размер области сканирования
int optr; // оптическое разрешение
int grey; // число градаций серого
};Решение задачи: «Создать структуру и написать функцию, которая записывает в бинарный файл данные о сканере из структуры»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include "f.h"
void input(FILE *tf)// создание нового файла
{
char choice;
setlocale(LC_ALL,"RUS");
tf=fopen("C:/file1.dat","wb"); // открытие бинарного файла для записи
printf("\n Ввод товаров\n");
do
{
printf("\n название: ");
scanf("%s",&s1.model);
printf("\n цена: ");
scanf("%d",&s1.price);
printf("\n горизонтальный размер области сканирования: ");
scanf("%f",&s1.x_size);
printf("\n вертикальный размер области сканирования: ");
scanf("%f",&s1.y_size);
printf("\n оптическое разрешение: ");
scanf("%d",&s1.optr);
printf("\n число градаций серого: ");
scanf("%d",&s1.grey);
fwrite(&s1,sizeof(s1),1,tf); // запись в файл одной структуры t1
printf("\n Закончить? y/n \n\n ");
choice=getch();
}
while (choice != 'y');
fclose(tf);
}
void print(FILE *tf)//просмотр файла
{
int i;
tf=fopen("C:/file1.dat","rb"); // открытие бинарного файла для чтения
i=1;
fread(&s1,sizeof(s1),1,tf); // чтение из файла одной структуры t1
while (!feof(tf))
{
printf("model %s \n price %d \n x_size %f \n y_size %f \n optr %d \n grey %d \n",s1.model,s1.price,s1.x_size,s1.y_size,s1.optr,s1.grey);
fread(&s1,sizeof(s1),1,tf);
i++;
}
getch();
}
void app(FILE *tf)//добавление в файл
{
char ch;
setlocale(LC_ALL,"RUS");
tf=fopen("C:/file1.dat","ab"); // открытие бинарного файла для добавления
printf("\n Ввод товаров \n");
do
{
printf("\n название: ");
scanf("%s",&s1.model);
printf("\n цена: ");
scanf("%d",&s1.price);
printf("\n горизонтальный размер области сканирования: ");
scanf("%f",&s1.x_size);
printf("\n вертикальный размер области сканирования: ");
scanf("%f",&s1.y_size);
printf("\n оптическое разрешение: ");
scanf("%d",&s1.optr);
printf("\n число градаций серого: ");
scanf("%d",&s1.grey);
fwrite(&s1,sizeof(s1),1,tf);
printf(" Закончить? y/n ");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}
int zapros(FILE *tf)
{
int i,j,k,o;
long int l;
struct scan_info *s1;
struct scan_info *s11;
struct scan_info1;
tf=fopen("C:/file1.dat", "wt");
printf ("сортировка по цене \n");
for(i = 0 ; i < k-1 ; i++)
{
for(j = 0 ; j < k - i-1 ; j++)
{
if(s1[j].price > s1[j+1].price)
{
s11[i] = s1[j];
s1[j] = s1[j+1] ;
s1[j+1] = s11[i];
}
}
}
l=sizeof(s11);
fseek(tf,-i,1); // возврат на sizeof(t1) байт назад
fwrite(&s1,sizeof(s11),1,tf); // запись изменённой структуры на прежнее место
fread(&s11,sizeof(s11),1,tf); // чтение из файла одной структуры t1
printf("model %s \n price %d \n x_size %f \n y_size %f \n optr %d \n grey %d \n",s11->model,s11->price,s11->x_size,s11->y_size,s11->optr,s11->grey);
getch();
fclose(tf);
return 0;
}
Объяснение кода листинга программы
- Объединение (union) используется для объединения нескольких структур данных в одну структуру. Это позволяет экономить место в памяти, так как несколько структур могут быть размещены в одном блоке памяти.
- В данном коде используется структура scan_info, которая содержит поля model, price, x_size, y_size, optr и grey.
- Функция input используется для ввода данных о сканере в бинарный файл. Она открывает файл для записи, запрашивает у пользователя данные о сканере и записывает их в файл.
- Функция print используется для просмотра содержимого файла. Она открывает файл для чтения, считывает данные из файла и выводит их на экран.
- Функция app используется для добавления данных о сканере в бинарный файл. Она открывает файл для добавления, запрашивает у пользователя данные о сканере и записывает их в файл.
- Функция zapros используется для сортировки данных в файле по цене. Она открывает файл для записи, сортирует данные по цене и записывает отсортированные данные обратно в файл.