如果文件不存在,则程序在C中失败

时间:2012-04-05 21:02:41

标签: c loops file-io

这曾经工作过。我不知道我做了什么让它停止工作,但是当我输入一个不存在的文件名时,我收到一个段违规错误,程序退出。

int main()
{
    File *fr;
    char input_file[32];
    int num_lines, valid;

    do{
        printf("\nEnter the name of the input file: ");
        scanf("%s", input_file);
        fr = fopen(input_file, "r");
        if(fr == NULL){
            valid = 0;
            printf("File does not exist...");
        }
        if(fr != NULL){
            fscanf(fr, "%d", &num_lines);
            numbers = malloc(sizeof(int) * num_lines);
            for(i=0;i<num_lines;i++){
                fscanf(fr, "%[^0123456789]%d", numbers+i);
                printf("%d\n", numbers[i]);
                valid =1;
            }
            free(numbers);
            fclose(fr);
        }

    }while(valid == 0);
}

/ edited /

5 个答案:

答案 0 :(得分:3)

请注意以下事项:

fr = fopen(input_file, "r");
fscanf(fr, "%d", &num_lines);
if(fr == NULL){

在这里,您将结果从fopen直接传递到fscanf,而不首先测试文件是否已成功打开。如果无法打开文件,fr将为NULL,因此会出现细分错误。

尝试重新排序代码,以便在确认fscanf之前不要执行fr != NULL。例如:

fr = fopen(input_file, "r");
if(fr != NULL){
    fscanf(fr, "%d", &num_lines);

希望这有帮助!

答案 1 :(得分:3)

嗯,这条线非常非常错误:

    scanf("%s", input_file[32]);

第二个参数应该是指向字符缓冲区的指针,但是你传递的是一个字符值,它可以指向任何随机位置。它似乎可以正常工作,但它会破坏你可能因某些原因需要的内存中的一些随机点!

然后你继续将调用fopen()的结果直接传递给fscanf(),而不先检查它是否为空;这也不会很好。

答案 2 :(得分:1)

在检查fscanf之前,您必须已将fr==NULL来电移至。您需要在fr==null检查后移动fscanf。

答案 3 :(得分:1)

在致电fr之前,您必须检查fscanf(fr, "%d", &num_lines)是否为空 并更改第一个scanf:scanf("%s", input_file);

答案 4 :(得分:1)

你应该检查

if(fr == NULL){
   valid = 0;
   printf("File does not exist...");
}   

之前

fscanf(fr, "%d", &num_lines);