【问题标题】:How to create function that opens files and let's other functions use them? [duplicate]如何创建打开文件的功能并让其他功能使用它们? [复制]
【发布时间】:2018-05-12 21:27:32
【问题描述】:

我想创建一个打开文件的函数,然后其他函数使用这个打开的文件。这是我的代码,

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

“文件未打开”未打印,因此应打开文件,但实际上 readWholeFile 不打印任何内容,因为文件将为空。有什么问题?

【问题讨论】:

  • FILE* inputFile: 您正在丢失文件句柄,仅在本地分配。*
  • 所以FILE* 是你的函数的结果。为什么(以及如何)将它作为参数传递?你为什么不直接从函数中return呢?

标签: c


【解决方案1】:

你的原型没有意义,openFile()传值时不能改变调用者的FILE *,这种情况下需要传指针的地址:

int openFile(FILE **inputFile)
{
  *inputFile = fopen("input.txt", "rt");
  return *inputFile == NULL ? -1 : 0;
}

但这当然没什么用,只需在您要打开文件的地方直接使用fopen() 即可。返回指向打开文件的指针更容易使用,而不必管理一个单独的int,它不携带任何附加值或信息(int 为 0 或 -1 并不比指针为 @ 更好987654327@或不NULL)。

【讨论】:

    【解决方案2】:

    您应该返回 inputFile 本身。那你可以从其他功能中重用它。 另外,为什么要将 FILE* 传递给 openFile 函数?这是多余的。

    设计方面,您可以传递文件名和参数,如rw 等。

    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() 调用之外,它实际上是在做任何事情。您可以从这个答案中了解到,您可以在 Functions 中传递指针以及如何使用它。

    其他答案提供了您如何使用双指针,但您了解之前的情况吗?

    您正在更改传递给openFile() 的局部变量。你改变它。当函数完成时,该局部变量不再存在。它的值不会影响main() 中的FILE* 变量。

    需要明确的是,您不需要此方法来打开文件。单独使用 2 行会更好。因为没有任何改善。您仍然需要检查返回值,就像直接调用 fopen 一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多