2012-01-18 105 views
1

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

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。任何有关如何实现这种类型的代码的一般技巧将不胜感激。 (注意:这是一个有关学校作业的问题,但是,我已经达到了作业的要求,并且仅仅因为我自己的好奇而对此感兴趣)〜谢谢!

+2

你的编译器应该抱怨(至少是警告)关于你发布的代码中至少有两件事情 - 试图为'void'函数返回一个非void表达式并将错误类型的指针传递给'openFiles() '。更不用说'fileData'声明中的错字。 – 2012-01-18 23:37:24

+0

作为一个附注,除非你只打开一个ascii文件,你应该添加“b”标志fopen。即使用'fopen(文件名,“rb”)'。不同之处在于,如果没有它,您将在文件的早期获得EOF。 – chacham15 2012-01-18 23:37:30

+1

您的程序是否编译时没有警告?提示:永远不要忽略编译器警告! – asaelr 2012-01-18 23:37:36

回答

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)

0

而是声明为

fdata fileData; 

然后

openFiles(&fileData); 

如果声明fileData作为fdata *然后&fileDatafdata **型的,其将不匹配你的函数参数的类型。

0

你在混合指针和变量。为了您的功能发挥作用,你应该申报FILEDATA如下:

fdata fileData; 

(没有指针),并在openFiles删除return。由于引用修改了参数,因此不需要。

0

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

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

编辑:或者只是改变类型fileDatafData,并通过其地址。