我正在尝试创建一个包含两个文件指针的结构。 (见下文)
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;
}
在main函数中,我首先将struct声明为:
fdata * fileData;
然后尝试通过以下方式访问它:
openFiles(&fileData);
我的程序运行并编译,但是我在将输入文件中的数据导入结构时遇到问题,当我检查输出时,它全部为0。任何有关如何实现此类代码的一般提示将不胜感激。 (注意:这是一个关于学校作业的问题,但是,我已经满足了作业的要求,我只是为了自己的好奇心而感兴趣)〜谢谢!
答案 0 :(得分: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)
答案 1 :(得分:0)
而是将其声明为
fdata fileData;
然后
openFiles(&fileData);
如果您将fileData
声明为fdata *
,那么&fileData
的类型fdata **
将与您的函数参数的类型不匹配。
答案 2 :(得分:0)
您正在使用变量混合指针。要使您的函数正常工作,您应该声明fileData,如下所示:
fdata fileData;
(没有指针),并移除return
中的openFiles
。由于参数被引用修改,因此不需要它。
答案 3 :(得分:0)
您有类型问题。 openFiles
应该fData*
,但您会将fData**
传递给它。
你应该做点什么:
fileData=malloc(sizeof(fData));
openFiles(fileData);
修改:或者只需将类型更改为fileData
至fData
,然后传递其地址。