2010-07-25 89 views
1

我正在構建一個程序,它有幾個需要從文件中讀取數據的函數。由於函數的使用相當頻繁,因此打開和關閉每個調用的文件都非常耗時,所以我的計劃是使FILE *對象成爲全局文件,並使文件打開整個程序的持續時間。很顯然,雖然,它是不可能的,因爲這樣的:創建全局FILE *對象?

#include <fstream> 
FILE * yhtit; 
yhtit = fopen("thefile.txt","r"); 
int main() { 
return 0; } 

給出錯誤:main.cpp|54|error: expected constructor, destructor, or type conversion before ‘=’ token|

什麼是最好的方式來保持一個文件打開程序的整個過程中,無需單獨傳遞文件*反對需要它的每個功能?

+0

即使您正在使用FILE *這實際上只是一個C問題而不是C++問題。 – 2010-07-25 05:16:51

+0

你應該將你的FILE *指針包裝在一個Singleton Logging類中,並使其延遲初始化。有效地歸結於具有全局(單)的對象,但它更整潔,如果你使用'Singleton'(相對於使用'全球FILE *' – bits 2010-07-25 06:52:49

+0

@bits:如何做一個單身日誌類幫助的功能,其中「幾個函數...需要從一個文件中讀取數據「爲什麼單身人士比全局人更」整潔「?試圖製作一個類似FILE *的對象單身人士似乎是單身人士的濫用,因爲它是一個有效的事情到了全局變量的解決方案做希望有一個程序打開多個文件。 – 2010-07-25 09:39:58

回答

7

你幾乎說得對。試試這個:

#include <fstream> 

FILE * yhtit; 

int main() { 
    yhtit = fopen("thefile.txt","r"); 

    //Do your thing here. 

    fclose(yhtit); 
    return 0; 
} 
+0

-1。 – Dacav 2010-07-25 06:46:55

+7

爲了公平起見,一個全局變量的解決辦法是什麼的問題是問了。 – wrosecrans 2010-07-25 09:13:53

+0

反駁downvote – syb0rg 2016-06-24 18:37:48

0
#include <fstream> 
FILE * yhtit = fopen("thefile.txt","r"); 
int main() { 
    return 0; } 
+0

-1全局變量的解決方案。 – Dacav 2010-07-25 06:47:30

+0

@Dacav:全局變量是問題的一部分,SCFrench沒有在他的解決方案中引入它,他只是修復了它的初始化。 – 2010-07-25 09:30:12

4

這將會是更好地FILE指針傳遞給函數,而不是創建一個全局變量。全局變量通常是代碼異味—可疑編碼的跡象。您可以將文件傳遞給您的函數,而無需多次打開和關閉該文件。例如:

#include <stdio.h> 

void readData(FILE *); 
void readMoreData(FILE *); 

int main() { 
    FILE *fp = fopen("...", "r"); 

    readData(fp); 
    readMoreData(fp); 

    fclose(fp); 
    return 0; 
} 
+0

Y es我同意這是一個值得懷疑的做法,並將其固定在我的待辦事項清單上,但此刻我只是想讓這件事情起作用。 – tsiki 2010-07-25 02:53:25

+1

@tziki:將一個參數傳遞給參數列表並不是什麼大事。放置全局變量實在是一個糟糕的主意,並且在將來需要修改源代碼時(尤其是在使用多線程時,在分析程序時全局變量很難跟蹤! – Dacav 2010-07-25 06:43:45

-1

可以保持在一個結構File *變量,使該結構從任何函數訪問。

typedef struct 
{ 
FILE *fp; 
//other members can also be part of this structure. 
}myData; 

appInit(myData *ptr) 
{ 
ptr->fp = fopen(<>,<>); 
//Initialise other variables also 

return; 
} 

appDeInit(myData *ptr) 
{ 

fclose(ptr->fp); 
} 


main() 
{ 
myData *ptr= malloc(sizeof(myData)); 
appInit(ptr); 
//Play with ptr in all your function calls 
foo(ptr); 


appDeInit(myData); 
}