我想创建一个打开文件的函数,然后其他函数使用这个打开的文件。这是我的代码,
#include <stdio.h>
int openFile(FILE* inputFile)
{
inputFile = fopen("input.txt", "r");
if (inputFile != NULL)
return 0;
else
return -1;
}
void readWholeFile(FILE* inputFile)
{
char str[20];
while (feof(inputFile)) {
fscanf(inputFile, str);
printf("%s\n", str);
}
}
int main() {
FILE* inputFile;
if (openFile(inputFile) == 0) {
readWholeFile(inputFile);
}
else
printf("File didn't open");
fclose(inputFile);
return 0;
}
&#34;文件没有打开&#34;没有打印所以文件应该打开但实际上readWholeFile没有打印任何文件将是空的。问题是什么?
答案 0 :(得分:1)
您的原型毫无意义,openFile()
无法更改来电者FILE *
当它按值传递时,您需要传递指针的地址在那种情况下:
int openFile(FILE **inputFile)
{
*inputFile = fopen("input.txt", "rt");
return *inputFile == NULL ? -1 : 0;
}
但是,这当然没有什么用处,只需直接在您要打开文件的位置使用fopen()
。返回指向打开文件的指针更容易使用,而不必管理不带附加值或信息的单独int
(int
为0或-1不是&#34;比指针为NULL
或不是NULL
)更好&#34;
答案 1 :(得分:0)
您应该自己返回inputFile
。那个wauy你可以从其他功能中重用它。
为什么将FILE*
传递给openFile
函数呢?这是多余的。
设计方面,您可以传递文件名和r
,w
等参数。
FILE* openFile(const char*name, const char*params)
{
inputFile = fopen(name, params);
if (inputFile != NULL)
return inputFile;
else
return NULL;
}
但在这样做时,你只是抽象出fopen()
电话。您仍然需要检查openFile()
的返回值。您可以使用双指针并实现相同的功能,但是我提供了替代方案。
FILE *inputFile = openFile("input.txt","r");
if( !inputFile ){
//...
}
就所显示的方法而言,除了包装fopen()
之外,这实际上正在做其他事情。你可以从这个答案中了解到你可以在函数中传递指针以及如何使用它。
其他答案提供了如何使用双指针,但是你得到了以前的情况吗?
您正在更改传递给openFile()
的本地变量。你改变它。当函数完成时,那个局部变量就不存在了。它的价值不会影响FILE*
中的main()
变量。
要清楚,您不需要此方法来打开文件。如果单独使用2条线,情况会更好。因为没有任何进步。您仍然需要检查返回值,就像直接fopen
调用时一样。