创建全局FILE *对象?

问题描述:

我正在构建一个程序,它有几个需要从文件中读取数据的函数。由于函数的使用相当频繁,因此打开和关闭每个调用的文件都非常耗时,所以我的计划是使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

你几乎说得对。试试这个:

#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

#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

这将会是更好地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

可以保持在一个结构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); 
}