Крах программы при выборе пункта меню - 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;
}

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

  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
Похожие ответы