2015-04-04 2 views
0

Я пытаюсь написать программу, которая будет выполнять линейное линейное затухание, линейное затухание или линейное перекрестное затухание, как указано пользователем, в файлах .au'` ,APPCRASH Внутренний оператор switch - C

Я сделал заявление switch на основании ввода пользователем int, который будет направлен в один из трех случаев, в зависимости от значения ввода.

В каждом из этих случаев я предлагаю пользователю полный путь к файлу, который он/она хочет использовать для затухания, а затем открыть файл для записи затухания.

Однако, похоже, что после открытия файла моя программа выйдет из строя. Я уверен, что правильно использую switch, и я обязательно закрою каждый файл в конце, поэтому я не уверен, почему программа продолжает сбой.

int main() 
{ 
    FILE *f1, *f2, *fout; 
    int r1, choice; 
    float dr; 
    char yn = 'y', path1[100], path2[100]; 

    while(yn == 'y' || yn == 'Y') 
    { 
     printf("Fade Out(1) Fade In(2) Cross-fade(3): "); 
     scanf("%i", &choice); 

     printf("Specify duration of fade (in seconds): "); 
     scanf("%d", &dr); 
     switch(choice) 
     { 
      case(1): 
       printf("Please specify full path of file you want to fade out\n"); 
       scanf("%s", path1); 
       f1 = fopen(path1, "r"); 
       if(f1 == NULL) 
       { 
        printf("Incorrect file path specifiation. Program terminating...\n"); 
        break; 
       } 
       fout = fopen("out.au", "w"); 
       //r1 = read_header(f1, NULL, fout, choice, dr); 
       printf("We've gotten this far!\n"); 
       break; 
      case(2): 
       printf("Please specify full path of file you want to fade in\n"); 
       scanf("%s", path1); 
       f1 = fopen(path1, "r"); 
       if(f1 == NULL) 
       { 
        printf("Incorrect file path specifiation. Program terminating...\n"); 
        break; 
       } 
       fout = fopen("out.au", "w"); 
       //r1 = read_header(f1, NULL, fout, choice, dr); 
       break; 
      case(3): 
       printf("Specify first file used to cross-fade\n"); 
       scanf("%s", path1); 
       printf("Specify second file used in cross-fade\n"); 
       scanf("%s", path2); 
       f1 = fopen(path1, "r"); 
       f2 = fopen(path2, "r"); 
       if((f1 == NULL || f2 == NULL)) 
       { 
        if(f1 == NULL) 
         printf("Incorrect file path specification for first file. Program terminating...\n"); 
        else 
         printf("Incorrect file path specification for second file. Program terminating...\n"); 
        break; 
       } 
       fout = fopen("out.au", "w"); 
       //r1 = read_header(f1, f2, fout, choice, dr); 
       break; 
      default: 
       printf("Not a valid option.\n"); 
       break; 
     } 
     fclose(f1); 
     if(f2 != NULL) 
      fclose(f2); 
     fclose(fout); 

     fflush(stdin); 
     printf("Again (y/n)? "); 
     scanf("%c", &yn); 
    } 

    return 0; 
} 
+0

Другой недостаток: вы закрываете 'fout', возможно, вы его не открыли. Вы на Linux? Я мог бы рассказать вам, как узнать причину сбоя с помощью 'gdb'. –

+0

Нет, я использую Windows с MinGW. – Delfino

ответ

2

Строка FILE *f1, *f2, *fout не инициализирует переменные.

Затем if(f2 != NULL) получает доступ к неинициализированной переменной.

Хуже того, fclose(f2) Различия в неинициализированном указателе.

1

Вы нарушаете, если файл не открывается, но после переключения вы пытаетесь закрыть указатель NULL.

+0

А, я понимаю, о чем вы говорите. Что делать, если я попробовал 'if (f2! = Null) fclose (f2);'? – Delfino

+0

Сделайте то же самое с f1 ... –

Смежные вопросы