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