Крах программы при выборе пункта меню - C (СИ)

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

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

Здравствуйте. Создаю программу, реализующую дек. Необходимо реализовать его через файловые данные. После пары часов работы, решил прогнать завершенные ее части. К моему удивлению программа крашится уже при выборе в меню. Может кто сталкивался с таким или может помочь исправить?
Листинг программы
  1. #include <stdio.h>
  2. int main (void) {
  3. char choice,tmp;
  4. FILE *list;
  5. char *listn="list.txt";
  6. char element[100];
  7. FILE *temp;
  8. char *tempn="temp.txt";
  9. do {
  10. printf("'1' - Create deque\n");
  11. printf("'2' - Add left element\n");
  12. printf("'3' - Add right element\n");
  13. printf("'4' - Delete left element\n");
  14. printf("'5' - Delete right element\n");
  15. printf("'6' - Calculate size of deque\n");
  16. printf("'7' - DUMP\n");
  17. choice=getch();
  18. switch (choice) {
  19. case '1':
  20. list=fopen(listn,'a+');
  21. if (list==NULL) {
  22. printf("Can't find fucking file. Please create file 'list.txt' before running program.");
  23. return 0;
  24. }
  25. else {
  26. printf("File opened successfully. Let's start the work!");
  27. fclose(list);
  28. };
  29. break;
  30. case '2':
  31. temp=fopen(tempn,'w');
  32. printf("Enter your element:\n");
  33. printf(">");
  34. scanf("%s",element);
  35. fprintf(temp,"%s\n",element);
  36. fclose(temp);
  37. copyadd (listn,tempn);
  38. copyfull(tempn,listn);
  39. break;//Add left
  40. case '3':
  41. fopen(listn,'a');
  42. printf("Enter your element:\n");
  43. printf(">");
  44. scanf("%s",element);
  45. fprintf("\n%s",element);
  46. fclose(list);
  47. break;
  48. case '4':
  49. fseek(list,0,2);
  50. break;
  51. case '5':
  52. break;
  53. case '6':
  54. printf("Deque size: %d\n",size(listn));
  55. break;
  56. case '7':
  57. break;
  58. default:
  59. printf("Make right choice!");
  60. };
  61. } while (choice!='7');
  62. return 0;
  63. }
  64. void copyfull (char *inn, char *outn) {
  65. FILE *in, *out;
  66. char tmp;
  67. in=fopen(inn,'r');
  68. out=fopen(outn,'w');
  69. while (!feof(in)) {
  70. tmp=getc(in);
  71. if (!feof(in)) putc(tmp,out);
  72. fclose(in);
  73. fclose(out);}
  74. };
  75. void copyadd (char *inn, char *outn) {
  76. FILE *in, *out;
  77. char tmp;
  78. in=fopen(inn,'r');
  79. out=fopen(outn,'a');
  80. while (!feof(in)) {
  81. tmp=getc(in);
  82. if (!feof(in)) putc(tmp,out);
  83. fclose(in);
  84. fclose(out);};
  85. };
  86. int size (char *name) {
  87. int d;
  88. FILE *file;
  89. fopen(name,'r');
  90. d=0;
  91. while (!feof(file)) {
  92. if (fgetc(file)=='\n') d++;
  93. };
  94. fclose(file);
  95. return d;
  96. }
Скрин дебаггера:

Решение задачи: «Крах программы при выборе пункта меню»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. void copyfull(char *inn, char *out);
  4. void copyadd(char *inn, char *out);
  5. int size (char *name);
  6. int main (void) {
  7.      char choice;
  8.      FILE *list;
  9.      char *listn = "list.txt";
  10.      char element[100];
  11.      FILE *temp;
  12.      char *tempn="temp.txt";
  13.  do {
  14.  printf("'1' - Create deque\n");
  15.  printf("'2' - Add left element\n");
  16.  printf("'3' - Add right element\n");
  17.  printf("'4' - Delete left element\n");
  18.  printf("'5' - Delete right element\n");
  19.  printf("'6' - Calculate size of deque\n");
  20.  printf("'7' - DUMP\n");
  21.  choice=getch();
  22.  switch (choice) {
  23.    case '1':
  24.     list=fopen(listn,"r");
  25.     if (list==NULL) {
  26.         printf("Can't find fucking file. Please create file 'list.txt' before running program.");
  27.         return 0;
  28.     }
  29.     else {
  30.         printf("File opened successfully. Let's start the work!\n");
  31.         fclose(list);
  32.     };
  33.     break;
  34.    case '2':
  35.     temp=fopen(tempn,"w");
  36.     printf("Enter your element:\n");
  37.     printf(">");
  38.     gets(element);
  39.     fprintf(temp,"%s\n",element);
  40.     fclose(temp);
  41.     copyadd (listn, tempn);
  42.     copyfull(tempn, listn);
  43.     break;//Add left
  44.    case '3':
  45.     fopen(listn,"a");
  46.     printf("Enter your element:\n");
  47.     printf(">");
  48.     scanf("%s",element);
  49.     fprintf(list, "\n%s", element);
  50.     fclose(list);
  51.     break;
  52.    case '4':
  53.     fseek(list,0,2);
  54.  
  55.     break;
  56.    case '5':
  57.     break;
  58.    case '6':
  59.     printf("Deque size: %d\n", size(listn));
  60.     break;
  61.    case '7':
  62.     break;
  63.    default:
  64.     printf("Make right choice!");
  65.     };
  66.  } while (choice!='7');
  67. return 0;
  68. }
  69. void copyfull (char *inn, char *outn) {
  70.     FILE *in, *out;
  71.     char tmp[100];
  72.     in=fopen(inn,"r");
  73.     out=fopen(outn,"w");
  74.     while (!feof(in)) {
  75.         fgets(tmp,100,in);
  76.         fputs(tmp,out);}
  77.     fclose(in);
  78.     fclose(out);};
  79. void copyadd (char *inn, char *outn) {
  80.     FILE *in, *out;
  81.     char tmp[100];
  82.     in=fopen(inn,"r");
  83.     out=fopen(outn,"a");
  84.     while (!feof(in)) {
  85.         fgets(tmp,100,in);
  86.         fputs(tmp,out);}
  87.     fclose(in);
  88.     fclose(out);;
  89. };
  90. int size (char *fname) {
  91.     FILE *name;
  92.     int d;
  93.     char tmp[100];
  94.     fopen(fname,"r");
  95.     d=0;
  96.     while (!feof(name)) {
  97.         fgets(tmp,100,name); d++;
  98.     };
  99.     fclose(name);
  100.     return d;
  101. }

Объяснение кода листинга программы

  1. В начале программы открывается файл 'list.txt' в режиме чтения и сразу же закрывается. Зачем? Ответ: Этот фрагмент кода проверяет, существует ли файл 'list.txt'. Если файл не найден, программа выводит сообщение об ошибке и завершает работу. Если файл найден, программа открывает его в режиме чтения и сразу же закрывает. Это необходимо для того, чтобы программа могла безопасно работать с файлом.
  2. Что делает функция copyfull? Ответ: Функция copyfull читает файл 'inn' построчно и записывает каждую строку в файл 'outn'.
  3. Что делает функция copyadd? Ответ: Функция copyadd читает файл 'inn' построчно и добавляет каждую строку в конец файла 'outn'.
  4. Что делает функция size? Ответ: Функция size считает количество строк в файле 'fname'.
  5. В случае выбора пункта меню '4', что происходит с файлом 'list'? Ответ: В этом случае файл 'list' перемещается в начало.
  6. В случае выбора пункта меню '5', что происходит с файлом 'list'? Ответ: В этом случае ничего не происходит с файлом 'list'.
  7. В случае выбора пункта меню '6', что делает функция size? Ответ: Функция size считает количество строк в файле 'list.txt' и выводит это значение.
  8. В случае выбора пункта меню '7', что происходит с программой? Ответ: В этом случае программа входит в бесконечный цикл и требует вмешательства пользователя для завершения работы.

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


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

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

12   голосов , оценка 3.833 из 5

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

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

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