2012-01-18 128 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,並通過其地址。