Крах программы при выборе пункта меню - 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', что происходит с программой? Ответ: В этом случае программа входит в бесконечный цикл и требует вмешательства пользователя для завершения работы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д