Создать структуру и написать функцию, которая записывает в бинарный файл данные о сканере из структуры - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Сама структура имеет вид:
struct scan_info{
            char model[25]; // наименование модели 
            int price;      // цена 
            double x_size;      // горизонтальный размер области сканирования
            double y_size;      // вертикальный размер области сканирования
            int optr;       // оптическое разрешение 
            int grey;       // число градаций серого 
            };
Структура файла: в первых 4-х байтах размещается значение типа long, определяющее количество сделанных в файл записей; далее без пропусков размещаются записи о сканерах. Написать функцию, которая извлекает из этого файла данные о сканере в структуру типа scan_info. Обязательный параметр – номер требуемой записи. Функция должна возвращать нулевое значение, если чтение прошло успешно, и 1 – иначе. Привести примеры программы, создающей файл с данными о сканерах (данные вводятся с клавиатуры) – 6-8 записей и выводящей на дисплей данные о запрошенной записи. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.

Решение задачи: «Создать структуру и написать функцию, которая записывает в бинарный файл данные о сканере из структуры»

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;
}

Объяснение кода листинга программы

  1. Объединение (union) используется для объединения нескольких структур данных в одну структуру. Это позволяет экономить место в памяти, так как несколько структур могут быть размещены в одном блоке памяти.
  2. В данном коде используется структура scan_info, которая содержит поля model, price, x_size, y_size, optr и grey.
  3. Функция input используется для ввода данных о сканере в бинарный файл. Она открывает файл для записи, запрашивает у пользователя данные о сканере и записывает их в файл.
  4. Функция print используется для просмотра содержимого файла. Она открывает файл для чтения, считывает данные из файла и выводит их на экран.
  5. Функция app используется для добавления данных о сканере в бинарный файл. Она открывает файл для добавления, запрашивает у пользователя данные о сканере и записывает их в файл.
  6. Функция zapros используется для сортировки данных в файле по цене. Она открывает файл для записи, сортирует данные по цене и записывает отсортированные данные обратно в файл.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы