Обработка бинарных файлов - исправить ошибку - C (СИ)

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

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

Всем привет, вот прога

с ошибкой (знаю где)!

Задание:

Составить программу, выполняющую следующие функции: 1. Создание нового файла; 2. Просмотр файла; 3. Добавление информации в конец файла; 4. Поиск по названию товара и изменение цены и количества; Файл создать из структур вида: название товара, его цена и количество. Задание выполнить в отдельных функциях. Использовать меню для выбора функций.

ПОМОГИТЕ ИСПРАВИТЬ ОШИБКУ в фун-ии FIND (ПОИСК)(fseek) - в конце. Не удаётся перезаписать структуру, программа странно себя ведёт, потом останавливается.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
struct tov {char name[10]; float c; int kol;} t1;
void input(FILE *); // создание нового файла
void print(FILE *); // просмотр файла
void app(FILE *); // добавление в файл
void find(FILE *); // поиск и изменение
void bay(FILE *);
main()
{ setlocale(LC_ALL, ""); // ВКЛЮЧАЕМ РУССКИЙ
    char c;
  FILE *tf;
  while (1)
  {
    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"); // открытие бинарного файла для записи
 
  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();
    printf("\n");
  }
  while (ch != 'y');
  fclose(tf);
}
void print(FILE *tf) // ПРОСМОТР ФАЙЛА
{ int i;
 
  tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения
  i=1;
  fread(&t1,sizeof(t1),1,tf); // чтение из файла одной структуры t1
  while (!feof(tf))
  { printf("\n  %d Товар: %10s Цена: %6.2f Кол-во: %d \n",i,t1.name,t1.c,t1.kol);
    fread(&t1,sizeof(t1),1,tf);
    i++;
  }
  fclose(tf);
}
void app(FILE *tf) // ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ
{ char ch;
  tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления
 
  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();
    printf("\n");
  }
  while (ch != 'y');
  fclose(tf);
}
 
void find(FILE *tf) // ПОИСК - ОШИБКА ТУТ
{ char h,tov[10];
  long int i;
  tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи
  puts(" Название искомого товара: ");
  gets(tov);
  fread(&t1,sizeof(t1),1,tf);
  while (!feof(tf))
   {if (strcmp(t1.name,tov)==0)
     {   printf(" Марка: %s Цена: %6.2f Кол-во: %d",t1.name,t1.c,t1.kol);
         printf("\n КУПИТЬ? y/n ");
         h=getch();
         if (h=='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);
}

Решение задачи: «Обработка бинарных файлов - исправить ошибку»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
struct tov 
{
    char name[10]; 
    float c; 
    int kol;
} t1;
 
void input(FILE **); // создание нового файла
void print(FILE **); // просмотр файла
void app(FILE **); // добавление в файл
void find(FILE **); // поиск и изменение
void bay(FILE **);
 
int main()
{ 
    setlocale(LC_ALL, ""); // ВКЛЮЧАЕМ РУССКИЙ
    char c;
    FILE *tf;
    
    while (1)
    {
        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"); // открытие бинарного файла для записи
 
    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();
        printf("\n");
    }
    while (ch != 'y');
    fclose(*tf);
    getchar();
}
 
void print(FILE **tf) // ПРОСМОТР ФАЙЛА
{ 
    int i;
 
    *tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения
    i=1;
    fread(&t1,sizeof(t1),1,*tf); // чтение из файла одной структуры t1
    while (!feof(*tf))
    { 
        printf("\n  %d Товар: %10s Цена: %6.2f Кол-во: %d \n",i,t1.name,t1.c,t1.kol);
        fread(&t1,sizeof(t1),1,*tf);
        i++;
    }
    fclose(*tf);
}
    
void app(FILE **tf) // ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ
{ 
    char ch;
    *tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления
 
    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();
        printf("\n");
    } while (ch != 'y');
    fclose(*tf);
    getchar();
}
 
void find(FILE **tf) // ПОИСК - ОШИБКА ТУТ
{ 
    char h, tov[10];
    long int i;
    *tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи
    puts(" Название искомого товара: ");
    gets(tov);
    fread(&t1,sizeof(t1),1,*tf);
    while (!feof(*tf))
    {
        if (strcmp(t1.name,tov)==0)
        {   
            printf(" Марка: %s Цена: %6.2f Кол-во: %d",t1.name,t1.c,t1.kol);
            printf("\n КУПИТЬ? y/n ");
            h=getch();
            if (h=='y')
            {  
                printf("\n Количество: ");
                scanf("%d",&t1.kol);
                printf("\n Цена: ");
                scanf("%f",&t1.c);
                i=sizeof(t1);
                fseek(*tf,-i,SEEK_CUR); // возврат на sizeof(t1) байт назад                ОШИБКА
                fwrite(&t1, sizeof(t1), 1, *tf);//запись изменённой структуры   ОШИБКА
                fflush(*tf);
            }
        }
        fread(&t1,sizeof(t1),1,*tf);
    }
    fclose(*tf);
    getchar();
}

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


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

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

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