C语言 文件打开时的错误处理

yrdbyhpb  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(236)

[问题1]

当我在函数中打开一个文件时,通常会执行以下操作:

int read_file (char *filename)
{
    FILE *fin;

    if ( !(fin = fopen(filename, "r")) )
        return 1;

    /* ... */

    return fclose(fin);
}

int main ()
{
    char filename[100];

    if ( read_file(filename) )
    {
        perror(filename);
        exit(1);
    }

    return 0;
}

通常0返回值是错误的(对吗?),那么我可以将前面的代码更改为:

int read_file (char *filename)
{
    FILE *fin;

    if ( !(fin = fopen(filename, "r")) )
        return 0;

    /* ... */

    return !fclose(fin);
}

int main ()
{
    char filename[100];

    if ( !read_file(filename) )
    {
        perror(filename);
        exit(1);
    }

    return 0;
}

但我觉得第一个密码更干净。
Another option只是将return 1;更改为return -1;(在我编写的第一个代码中)。
最好的版本是什么?

[问题2]

如果我必须处理更多的错误,像这样的代码是正确的吗?

int read_file (char *filename, int **vet)
{
    FILE *fin;

    if ( !(fin = fopen(filename, "r")) )
    {
        perror(filename);
        return 1;
    }

    * vet = malloc (10 * sizeof(int));
    if ( *vet == NULL )
    {
        perror("Memory allocation error.\n");
        return 1;   
    }

    /* ... */

    return fclose(fin);
}

int main ()
{
    char filename[100];
    int *vet;

    if ( read_file(filename, &vet) )
        exit(1);

    return 0;
}
zpqajqem

zpqajqem1#

关于Q1:
a)大多数POSIX函数实际上返回-1(或〈0)表示错误,而不是0。例如,open()close()read()write()等等。例外是返回指针的POSIX调用,例如fopen(),它返回FILE *。这些函数在出错时返回NULL
B)我把代码编写成像POSIX函数一样工作,这与许多Linux程序的内部结构类似。我称之为“UNIX C标准”。然而,许多C++程序和Java程序使用true表示成功,false表示失败。当这些程序员转向C时,他们使用1表示成功,0表示失败。这没有错,但确实会引起混乱(嗯,让我很困惑)。最糟糕的结果是当两个标准都用在同一个程序中时。挑选一个标准并坚持它比你选择哪个标准更重要。
c)我自己的选择(相对于Q1)是在出错时返回-1(即按照您的“另一个选择”行)。
关于问题2:大部分是对的。
a)如果你的程序成功了,我相信exit(0)return 0更好。
B)perror在哪里完全取决于你。也许你想在main()中打印错误。
c)如果您没有要执行的清理或在atexit内进行清理,则使用perror后紧跟exit(1)(或根据错误可能使用不同的退出代码)是合理的正常操作。
d)如果返回fclose()出错的结果,则fopen失败时返回的值应为-1(或EOF)而不是1,就像fclose()失败时返回EOF(也称为-1)一样。
e)Nit:您的main函数应该有参数(例如int main(char **argv, int argc)

31moq8wy

31moq8wy2#

关于错误的负数- cppcheck对此给出了警告。在程序套件中选择一个标准是个好主意-程序员有足够的内部逻辑来处理而不需要重复...所以在尝试修复一些自由a开源软件程序后,我很可能会接受cppcheck的建议,那么至少我可以有一些东西来检查我采用的标准。

相关问题