从函数返回指针的方法(C语言)

6
在我的C程序中,这个函数将处理打开特定文件的所有工作,并返回文件指针,因此主函数或其他函数可以使用fp读取内容,但是到目前为止我还没有成功实现这个功能。由于我正在学习这种语言,所以很可能我做错了什么。
int open_text_file(char text_file_name[])
{
    FILE *fp;

    if((fp = fopen(text_file_name, "r")) != 0)
    {
            return fp;
    }

    else
    {
            printf("Cannot open file \"%s\"\n", text_file_name);
    }
}

1
除了这个错误,你还看到了什么?你试图将指向FILE结构的指针作为int返回。 - Carl Norum
1
作为一种编码风格问题,你应该将fpNULL进行比较,而不是与0进行比较。把赋值语句和对fp的比较分成两个独立的语句可能会更清晰。 - David R Tribble
3个回答

11
在第一行,你有
int open_text_file(char text_file_name[])

这将返回类型声明为int

你应该拥有的是

FILE * open_text_file(char text_file_name[])

同时,在你的“else”情况下,你应该返回一些内容来向调用者指示错误。

return NULL

是一个合适的选择。但在调用它时,请确保检查返回值。


完美,现在我能够将argv[1]传递给函数并从主函数中打印内容。正如你们中的许多人所说,我应该将fp与NULL进行比较,为什么呢? - KJ0090
在一些不常见的平台上,NULL可能不是0。然而,在C++中或者大多数实际情况下,这并不成立。 - McPherrinM

6

这个函数有点无意义,因为它仅仅是执行了fopen()的操作,并且增加了错误信息。这并不是很好的设计,因为错误分支还需要返回一个(可能是NULL)指针,而且在调用代码中必须再次进行测试。更好的做法是简单地写成:

FILE * fp = fopen( somefile, "r" );
if ( fp == NULL ) {
   fprintf( stderr, "Cannot open %s\n", somefile );
   exit(1);   // or whatever you need to do to handle the error
}

0

FILE* open_text_file(); 需要成为原型。

int 不是 FILE*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接