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