Обработка бинарных файлов - исправить ошибку - 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();
}