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

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

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

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

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

Задание:

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

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

Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <locale.h>
  5. struct tov {char name[10]; float c; int kol;} t1;
  6. void input(FILE *); // создание нового файла
  7. void print(FILE *); // просмотр файла
  8. void app(FILE *); // добавление в файл
  9. void find(FILE *); // поиск и изменение
  10. void bay(FILE *);
  11. main()
  12. { setlocale(LC_ALL, ""); // ВКЛЮЧАЕМ РУССКИЙ
  13. char c;
  14. FILE *tf;
  15. while (1)
  16. {
  17. puts(" 1 – новый файл");
  18. puts(" 2 – просмотр файла");
  19. puts(" 3 – добавление в файл");
  20. puts(" 4 – поиск и изменение");
  21. puts(" 0 - выход");
  22. c=getch();
  23. switch(c)
  24. { case '1':input(tf);break;
  25. case '2':print(tf);break;
  26. case '3':app(tf);break;
  27. case '4':find(tf);break;
  28. case '0':return 0;
  29. default : puts(" неверный режим");
  30. }
  31. }
  32. }
  33. void input(FILE *tf) // СОЗДАНИЕ НОВОГО ФАЙЛА
  34. { char ch;
  35. tf=fopen("file1.dat","wb"); // открытие бинарного файла для записи
  36. printf("\n Ввод товаров\n");
  37. do
  38. { printf("\n Марка: "); scanf("%s",&t1.name);
  39. printf(" Цена: "); scanf("%f",&t1.c);
  40. printf(" Количество: "); scanf("%d",&t1.kol);
  41. fwrite(&t1,sizeof(t1),1,tf); // запись в файл одной структуры t1
  42. printf("\n Закончить? y/n ");
  43. ch=getch();
  44. printf("\n");
  45. }
  46. while (ch != 'y');
  47. fclose(tf);
  48. }
  49. void print(FILE *tf) // ПРОСМОТР ФАЙЛА
  50. { int i;
  51. tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения
  52. i=1;
  53. fread(&t1,sizeof(t1),1,tf); // чтение из файла одной структуры t1
  54. while (!feof(tf))
  55. { printf("\n %d Товар: %10s Цена: %6.2f Кол-во: %d \n",i,t1.name,t1.c,t1.kol);
  56. fread(&t1,sizeof(t1),1,tf);
  57. i++;
  58. }
  59. fclose(tf);
  60. }
  61. void app(FILE *tf) // ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ
  62. { char ch;
  63. tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления
  64. printf("\n Ввод товаров \n");
  65. do
  66. { printf("\n Марка: "); scanf("%s",&t1.name);
  67. printf(" Цена: "); scanf("%f",&t1.c);
  68. printf(" Количество: "); scanf("%d",&t1.kol);
  69. fwrite(&t1,sizeof(t1),1,tf);
  70. printf(" Закончить? y/n ");
  71. ch=getch();
  72. printf("\n");
  73. }
  74. while (ch != 'y');
  75. fclose(tf);
  76. }
  77. void find(FILE *tf) // ПОИСК - ОШИБКА ТУТ
  78. { char h,tov[10];
  79. long int i;
  80. tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи
  81. puts(" Название искомого товара: ");
  82. gets(tov);
  83. fread(&t1,sizeof(t1),1,tf);
  84. while (!feof(tf))
  85. {if (strcmp(t1.name,tov)==0)
  86. { printf(" Марка: %s Цена: %6.2f Кол-во: %d",t1.name,t1.c,t1.kol);
  87. printf("\n КУПИТЬ? y/n ");
  88. h=getch();
  89. if (h=='y')
  90. { printf("\n Количество: ");scanf("%d",&t1.kol);
  91. printf("\n Цена: ");scanf("%f",&t1.c);
  92. i=sizeof(t1);
  93. fseek(tf,i,1); // возврат на sizeof(t1) байт назад ОШИБКА
  94. fwrite(&t1,sizeof(t1),1,tf);//запись изменённой структуры ОШИБКА
  95. }
  96. }
  97. fread(&t1,sizeof(t1),1,tf);
  98. }
  99. fclose(tf);
  100. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <locale.h>
  5. struct tov
  6. {
  7.     char name[10];
  8.     float c;
  9.     int kol;
  10. } t1;
  11.  
  12. void input(FILE **); // создание нового файла
  13. void print(FILE **); // просмотр файла
  14. void app(FILE **); // добавление в файл
  15. void find(FILE **); // поиск и изменение
  16. void bay(FILE **);
  17.  
  18. int main()
  19. {
  20.     setlocale(LC_ALL, ""); // ВКЛЮЧАЕМ РУССКИЙ
  21.     char c;
  22.     FILE *tf;
  23.    
  24.     while (1)
  25.     {
  26.         puts("  1 – новый файл");
  27.         puts("  2 – просмотр файла");
  28.         puts("  3 – добавление в файл");
  29.         puts("  4 – поиск и изменение");
  30.         puts("  0 - выход");
  31.         c=getch();
  32.         switch(c)
  33.         {  
  34.             case '1':input(&tf);break;
  35.             case '2':print(&tf);break;
  36.             case '3':app(&tf);break;
  37.             case '4':find(&tf);break;
  38.             case '0':return 0;
  39.             default : puts(" неверный режим");
  40.         }
  41.     }
  42. }
  43.    
  44. void input(FILE **tf) // СОЗДАНИЕ НОВОГО ФАЙЛА
  45. {
  46.     char ch;
  47.     *tf=fopen("file1.dat","wb"); // открытие бинарного файла для записи
  48.  
  49.     printf("\n Ввод товаров\n");
  50.     do
  51.     {
  52.         printf("\n Марка: ");
  53.         scanf("%s",&t1.name);
  54.         printf(" Цена: ");
  55.         scanf("%f",&t1.c);
  56.         printf(" Количество: ");
  57.         scanf("%d",&t1.kol);
  58.         fwrite(&t1,sizeof(t1),1,*tf); // запись в файл одной структуры t1
  59.         printf("\n Закончить?  y/n  ");
  60.         ch=getch();
  61.         printf("\n");
  62.     }
  63.     while (ch != 'y');
  64.     fclose(*tf);
  65.     getchar();
  66. }
  67.  
  68. void print(FILE **tf) // ПРОСМОТР ФАЙЛА
  69. {
  70.     int i;
  71.  
  72.     *tf=fopen("file1.dat","rb"); // открытие бинарного файла для чтения
  73.     i=1;
  74.     fread(&t1,sizeof(t1),1,*tf); // чтение из файла одной структуры t1
  75.     while (!feof(*tf))
  76.     {
  77.         printf("\n  %d Товар: %10s Цена: %6.2f Кол-во: %d \n",i,t1.name,t1.c,t1.kol);
  78.         fread(&t1,sizeof(t1),1,*tf);
  79.         i++;
  80.     }
  81.     fclose(*tf);
  82. }
  83.    
  84. void app(FILE **tf) // ДОБАВЛЕНИЕ НОВОЙ ЗАПИСИ
  85. {
  86.     char ch;
  87.     *tf=fopen("file1.dat","ab"); // открытие бинарного файла для добавления
  88.  
  89.     printf("\n  Ввод товаров \n");
  90.     do
  91.     {  
  92.         printf("\n Марка: "); scanf("%s",&t1.name);
  93.         printf(" Цена: "); scanf("%f",&t1.c);
  94.         printf(" Количество: "); scanf("%d",&t1.kol);
  95.         fwrite(&t1,sizeof(t1),1,*tf);
  96.         printf(" Закончить?  y/n ");
  97.         ch=getch();
  98.         printf("\n");
  99.     } while (ch != 'y');
  100.     fclose(*tf);
  101.     getchar();
  102. }
  103.  
  104. void find(FILE **tf) // ПОИСК - ОШИБКА ТУТ
  105. {
  106.     char h, tov[10];
  107.     long int i;
  108.     *tf=fopen("file1.dat","rb+"); // открытие бинарного файла для чтения и записи
  109.     puts(" Название искомого товара: ");
  110.     gets(tov);
  111.     fread(&t1,sizeof(t1),1,*tf);
  112.     while (!feof(*tf))
  113.     {
  114.         if (strcmp(t1.name,tov)==0)
  115.         {  
  116.             printf(" Марка: %s Цена: %6.2f Кол-во: %d",t1.name,t1.c,t1.kol);
  117.             printf("\n КУПИТЬ? y/n ");
  118.             h=getch();
  119.             if (h=='y')
  120.             {  
  121.                 printf("\n Количество: ");
  122.                 scanf("%d",&t1.kol);
  123.                 printf("\n Цена: ");
  124.                 scanf("%f",&t1.c);
  125.                 i=sizeof(t1);
  126.                 fseek(*tf,-i,SEEK_CUR); // возврат на sizeof(t1) байт назад                ОШИБКА
  127.                 fwrite(&t1, sizeof(t1), 1, *tf);//запись изменённой структуры   ОШИБКА
  128.                 fflush(*tf);
  129.             }
  130.         }
  131.         fread(&t1,sizeof(t1),1,*tf);
  132.     }
  133.     fclose(*tf);
  134.     getchar();
  135. }

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


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

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

11   голосов , оценка 3.545 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы