Обработка бинарных файлов - исправить ошибку - 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();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д