Крах программы при выборе пункта меню - C (СИ)
Формулировка задачи:
Здравствуйте. Создаю программу, реализующую дек. Необходимо реализовать его через файловые данные. После пары часов работы, решил прогнать завершенные ее части. К моему удивлению программа крашится уже при выборе в меню. Может кто сталкивался с таким или может помочь исправить?
Скрин дебаггера:
#include <stdio.h> int main (void) { char choice,tmp; FILE *list; char *listn="list.txt"; char element[100]; FILE *temp; char *tempn="temp.txt"; do { printf("'1' - Create deque\n"); printf("'2' - Add left element\n"); printf("'3' - Add right element\n"); printf("'4' - Delete left element\n"); printf("'5' - Delete right element\n"); printf("'6' - Calculate size of deque\n"); printf("'7' - DUMP\n"); choice=getch(); switch (choice) { case '1': list=fopen(listn,'a+'); if (list==NULL) { printf("Can't find fucking file. Please create file 'list.txt' before running program."); return 0; } else { printf("File opened successfully. Let's start the work!"); fclose(list); }; break; case '2': temp=fopen(tempn,'w'); printf("Enter your element:\n"); printf(">"); scanf("%s",element); fprintf(temp,"%s\n",element); fclose(temp); copyadd (listn,tempn); copyfull(tempn,listn); break;//Add left case '3': fopen(listn,'a'); printf("Enter your element:\n"); printf(">"); scanf("%s",element); fprintf("\n%s",element); fclose(list); break; case '4': fseek(list,0,2); break; case '5': break; case '6': printf("Deque size: %d\n",size(listn)); break; case '7': break; default: printf("Make right choice!"); }; } while (choice!='7'); return 0; } void copyfull (char *inn, char *outn) { FILE *in, *out; char tmp; in=fopen(inn,'r'); out=fopen(outn,'w'); while (!feof(in)) { tmp=getc(in); if (!feof(in)) putc(tmp,out); fclose(in); fclose(out);} }; void copyadd (char *inn, char *outn) { FILE *in, *out; char tmp; in=fopen(inn,'r'); out=fopen(outn,'a'); while (!feof(in)) { tmp=getc(in); if (!feof(in)) putc(tmp,out); fclose(in); fclose(out);}; }; int size (char *name) { int d; FILE *file; fopen(name,'r'); d=0; while (!feof(file)) { if (fgetc(file)=='\n') d++; }; fclose(file); return d; }
Решение задачи: «Крах программы при выборе пункта меню»
textual
Листинг программы
#include <stdio.h> #include <conio.h> void copyfull(char *inn, char *out); void copyadd(char *inn, char *out); int size (char *name); int main (void) { char choice; FILE *list; char *listn = "list.txt"; char element[100]; FILE *temp; char *tempn="temp.txt"; do { printf("'1' - Create deque\n"); printf("'2' - Add left element\n"); printf("'3' - Add right element\n"); printf("'4' - Delete left element\n"); printf("'5' - Delete right element\n"); printf("'6' - Calculate size of deque\n"); printf("'7' - DUMP\n"); choice=getch(); switch (choice) { case '1': list=fopen(listn,"r"); if (list==NULL) { printf("Can't find fucking file. Please create file 'list.txt' before running program."); return 0; } else { printf("File opened successfully. Let's start the work!\n"); fclose(list); }; break; case '2': temp=fopen(tempn,"w"); printf("Enter your element:\n"); printf(">"); gets(element); fprintf(temp,"%s\n",element); fclose(temp); copyadd (listn, tempn); copyfull(tempn, listn); break;//Add left case '3': fopen(listn,"a"); printf("Enter your element:\n"); printf(">"); scanf("%s",element); fprintf(list, "\n%s", element); fclose(list); break; case '4': fseek(list,0,2); break; case '5': break; case '6': printf("Deque size: %d\n", size(listn)); break; case '7': break; default: printf("Make right choice!"); }; } while (choice!='7'); return 0; } void copyfull (char *inn, char *outn) { FILE *in, *out; char tmp[100]; in=fopen(inn,"r"); out=fopen(outn,"w"); while (!feof(in)) { fgets(tmp,100,in); fputs(tmp,out);} fclose(in); fclose(out);}; void copyadd (char *inn, char *outn) { FILE *in, *out; char tmp[100]; in=fopen(inn,"r"); out=fopen(outn,"a"); while (!feof(in)) { fgets(tmp,100,in); fputs(tmp,out);} fclose(in); fclose(out);; }; int size (char *fname) { FILE *name; int d; char tmp[100]; fopen(fname,"r"); d=0; while (!feof(name)) { fgets(tmp,100,name); d++; }; fclose(name); return d; }
Объяснение кода листинга программы
- В начале программы открывается файл 'list.txt' в режиме чтения и сразу же закрывается. Зачем? Ответ: Этот фрагмент кода проверяет, существует ли файл 'list.txt'. Если файл не найден, программа выводит сообщение об ошибке и завершает работу. Если файл найден, программа открывает его в режиме чтения и сразу же закрывает. Это необходимо для того, чтобы программа могла безопасно работать с файлом.
- Что делает функция copyfull? Ответ: Функция copyfull читает файл 'inn' построчно и записывает каждую строку в файл 'outn'.
- Что делает функция copyadd? Ответ: Функция copyadd читает файл 'inn' построчно и добавляет каждую строку в конец файла 'outn'.
- Что делает функция size? Ответ: Функция size считает количество строк в файле 'fname'.
- В случае выбора пункта меню '4', что происходит с файлом 'list'? Ответ: В этом случае файл 'list' перемещается в начало.
- В случае выбора пункта меню '5', что происходит с файлом 'list'? Ответ: В этом случае ничего не происходит с файлом 'list'.
- В случае выбора пункта меню '6', что делает функция size? Ответ: Функция size считает количество строк в файле 'list.txt' и выводит это значение.
- В случае выбора пункта меню '7', что происходит с программой? Ответ: В этом случае программа входит в бесконечный цикл и требует вмешательства пользователя для завершения работы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д