6

[问题一]

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

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

但我认为第一个代码更干净。

另一种选择是仅更改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;
}
4

1 回答 1

3

关于 Q1:

a) 大多数 POSIX 函数实际上为错误返回 -1(或 <0) ,而不是 0。看看(例如)open()、、、close()等等。例外是返回指针的 POSIX 调用,例如,它返回一个. 这些返回错误。read()write()fopen()FILE *NULL

b) 我将我的代码编码为像 POSIX 函数一样工作,这类似于许多 linux 程序的内部结构。我称之为“UNIX C 标准”。然而,许多 C++ 程序和 Java 程序true用于成功和false失败。当这些程序员转向 C 时,他们使用 1 表示成功,使用 0 表示失败。这没有错,但确实会引起混乱(好吧,让我感到困惑)。最坏的结果是在同一个程序中同时使用这两种标准。选择一个标准并坚持下去比你选择哪个标准更重要。

c) 我自己的选择(与 Q1 相关)是返回-1错误(即根据您的“另一个选择”行)。

关于 Q2:大部分是对的,是的。

a) 如果你的计划是成功的,exit(0)return 0我相信的要好。

b)perror完全取决于您自己。也许您想将错误打印在main().

c)如果您没有清理工作要做或perror在.exit(1)atexit

d) 如果您返回fclose()on 错误的结果,则返回 if fopenfailed 应该是-1(或EOF)而不是 1,因为如果fclose()失败则返回EOF(也称为-1)。

e) Nit:你的main函数应该有参数(例如int main(char **argv, int argc)

于 2014-01-21T21:12:03.957 回答