0

这曾经奏效。我不知道我做了什么让它停止工作,但是当我输入一个不存在的文件名时,我得到一个段冲突错误并且程序退出。

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);
}

/已编辑/

4

5 回答 5

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);

希望这可以帮助!

于 2012-04-05T21:05:00.090 回答
3

好吧,这条线是非常非常错误的:

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

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

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

于 2012-04-05T21:05:13.413 回答
1

fscanf在检查 if 之前,您必须已将呼叫移至fr==NULL。您需要在检查后将 fscanf 移至fr==null

于 2012-04-05T21:05:26.110 回答
1

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

于 2012-04-05T21:05:28.107 回答
1

你应该检查

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

fscanf(fr, "%d", &num_lines);
于 2012-04-05T21:05:56.347 回答