【问题标题】:C Language, a Structure of FilesC 语言,一种文件结构
【发布时间】:2012-01-18 23:28:35
【问题描述】:

我正在尝试创建一个包含两个文件指针的结构。 (见下文)

    typedef struct dataFiles
    {
        FILE * inputSet;
        FILE * outputSet;
    }fData;

我希望能够使用它来使用一个函数来打开和关闭文件,我这里有一个:

    void openFiles(struct dataFiles * fiData)
    {
        fiData->inputSet = fopen("inputfile.txt","r");
        fiData->outputSet = fopen("outputfile.txt","o");
        return fiData;
    }

在主函数中,我首先将结构声明为:

    fdata * fileData;

然后尝试通过以下方式访问它:

    openFiles(&fileData);

我的程序运行并编译,但我在将输入文件中的数据导入结构时遇到问题,当我检查我的输出时,它全为 0。任何有关如何实现此类代码的一般提示将不胜感激。 (注:这是一个与学校作业有关的问题,不过,我已经满足了作业的要求,只是出于自己的好奇而对此感兴趣)~谢谢!

【问题讨论】:

  • 您的编译器应该抱怨(至少是警告)您发布的代码中的至少两件事 - 尝试为 void 函数返回非 void 表达式并传递错误类型的指针到openFiles()。更不用说fileData 声明中的错字了。
  • 作为旁注,除非您只打开一个 ascii 文件,否则您应该将“b”标志添加到 fopen。即使用fopen(filename, "rb")。不同之处在于,如果没有它,您将在文件早期获得 EOF。
  • 你的程序编译时没有警告吗?提示:永远不要忽略编译器警告!
  • 如果您从命令行编译,请添加标志-Wall。例如。 gcc -Wall -o out file.c

标签: c computer-science codeblocks


【解决方案1】:

声明如下:

fdata fileData; //This memory is on the stack, not the heap

内存可以在两个地方,堆栈上和堆上。堆栈上的内存不需要分配,您只需要获取对它的引用。因此,&fileData 将为您提供所需的指针。但是,您不能返回指向堆栈上数据的指针。因此,您需要一个指向堆的指针。要在堆中创建指向内存的指针,您可以使用所需的内存大小调用 malloc。在这种情况下,它是malloc(sizeof(fileData))。这将返回一个 void*,您需要将其转换为 fileData*。

也变了

 void openFiles(struct dataFiles * fiData)
 fData openFiles(struct dataFiles * fiData)

【讨论】:

    【解决方案2】:

    宁可声明为

    fdata fileData;
    

    然后

    openFiles(&fileData);
    

    如果您将fileData 声明为fdata *,那么&fileData 的类型将是fdata **,它与您的函数参数的类型不匹配。

    【讨论】:

      【解决方案3】:

      您将指针与变量混合在一起。为了使您的函数正常工作,您应该按如下方式声明 fileData:

      fdata fileData;
      

      (不带指针),并删除openFiles 中的return。不需要,因为参数是通过引用修改的。

      【讨论】:

        【解决方案4】:

        您有类型问题。 openFiles 应该得到 fData* ,但你将 fData** 传递给它。 你应该这样做:

        fileData=malloc(sizeof(fData));
        openFiles(fileData);
        

        编辑:或者只是将类型更改为fileDatafData,并传递其地址。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-16
          • 1970-01-01
          • 2012-12-29
          • 2021-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多