c – 文件打开时的错误处理

前端之家收集整理的这篇文章主要介绍了c – 文件打开时的错误处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
[问题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只改变返回1;返回-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;
}

解决方法

回复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(即根据你的“另一个选择”行). Re Q2:大多是正确的,是的. a)如果你的程序成功,最好退出(0)而不是返回0我相信. b)你恐怖的地方取决于你.也许你想在main()中打印错误. c)如果你没有清理或在atexit内清理,则使用perror然后立即退出(1)(或者可能是不同的退出代码,具体取决于错误)是合理的正常情况. d)如果你在错误时返回fclose()的结果,那么如果fopen失败则返回应该是-1(或EOF)而不是1,就好像fclose()失败它返回EOF(也称为-1). e)Nit:你的主函数应该有参数(例如int main(char ** argv,int argc))

猜你在找的C&C++相关文章