C++ 创建全局文件*对象?
我正在构建一个程序,它有几个函数需要从文件中读取数据。由于函数的使用相当频繁,每次调用打开和关闭文件都会非常耗时,因此我的计划是将file*对象设置为全局,并在整个程序期间打开文件。显然,这是不可能的,因为:C++ 创建全局文件*对象?,c++,c,C++,C,我正在构建一个程序,它有几个函数需要从文件中读取数据。由于函数的使用相当频繁,每次调用打开和关闭文件都会非常耗时,因此我的计划是将file*对象设置为全局,并在整个程序期间打开文件。显然,这是不可能的,因为: #include <fstream> FILE * yhtit; yhtit = fopen("thefile.txt","r"); int main() { return 0; } #包括 文件*yhtit; yhtit=fopen(“thefile.txt”,“r”);
#include <fstream>
FILE * yhtit;
yhtit = fopen("thefile.txt","r");
int main() {
return 0; }
#包括
文件*yhtit;
yhtit=fopen(“thefile.txt”,“r”);
int main(){
返回0;}
给出错误:main.cpp | 54 |错误:在“=”标记之前需要构造函数、析构函数或类型转换|
在整个程序期间保持文件打开的最佳方法是什么,而不必将file*对象单独传递给每个需要它的函数?您几乎做到了。试试这个:
#include <fstream>
FILE * yhtit;
int main() {
yhtit = fopen("thefile.txt","r");
//Do your thing here.
fclose(yhtit);
return 0;
}
#包括
文件*yhtit;
int main(){
yhtit=fopen(“thefile.txt”,“r”);
//在这里做你的事。
fclose(yhtit);
返回0;
}
你几乎做对了。试试这个:
#include <fstream>
FILE * yhtit;
int main() {
yhtit = fopen("thefile.txt","r");
//Do your thing here.
fclose(yhtit);
return 0;
}
#包括
文件*yhtit;
int main(){
yhtit=fopen(“thefile.txt”,“r”);
//在这里做你的事。
fclose(yhtit);
返回0;
}
#包括
文件*yhtit=fopen(“thefile.txt”、“r”);
int main(){
返回0;}
#包括
文件*yhtit=fopen(“thefile.txt”、“r”);
int main(){
返回0;}
最好将文件
指针传递到函数,而不是创建全局变量。全局变量通常是编码有问题的标志。您可以将文件传递给函数,而无需多次打开和关闭文件。例如:
#include <stdio.h>
void readData(FILE *);
void readMoreData(FILE *);
int main() {
FILE *fp = fopen("...", "r");
readData(fp);
readMoreData(fp);
fclose(fp);
return 0;
}
#包括
无效读取数据(文件*);
作废readMoreData(文件*);
int main(){
文件*fp=fopen(“…”,“r”);
读取数据(fp);
readMoreData(fp);
fclose(fp);
返回0;
}
最好将文件
指针传递到函数,而不是创建全局变量。全局变量通常是编码有问题的标志。您可以将文件传递给函数,而无需多次打开和关闭文件。例如:
#include <stdio.h>
void readData(FILE *);
void readMoreData(FILE *);
int main() {
FILE *fp = fopen("...", "r");
readData(fp);
readMoreData(fp);
fclose(fp);
return 0;
}
#包括
无效读取数据(文件*);
作废readMoreData(文件*);
int main(){
文件*fp=fopen(“…”,“r”);
读取数据(fp);
readMoreData(fp);
fclose(fp);
返回0;
}
您可以在结构中维护文件*
变量,并使该结构可从任何函数访问
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);
}
typedef结构
{
文件*fp;
//其他成员也可以是此结构的一部分。
}我的数据;
appInit(myData*ptr)
{
ptr->fp=fopen(,);
//也初始化其他变量
返回;
}
appDeInit(myData*ptr)
{
fclose(ptr->fp);
}
main()
{
myData*ptr=malloc(sizeof(myData));
appInit(ptr);
//在所有函数调用中使用ptr
foo(ptr);
appDeInit(myData);
}
您可以在结构中维护文件*
变量,并使该结构可从任何函数访问
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);
}
typedef结构
{
文件*fp;
//其他成员也可以是此结构的一部分。
}我的数据;
appInit(myData*ptr)
{
ptr->fp=fopen(,);
//也初始化其他变量
返回;
}
appDeInit(myData*ptr)
{
fclose(ptr->fp);
}
main()
{
myData*ptr=malloc(sizeof(myData));
appInit(ptr);
//在所有函数调用中使用ptr
foo(ptr);
appDeInit(myData);
}
是的,我同意在我的待办事项列表中,这是一个有问题的做法和修复,但目前我只是想让这件事起作用。@tziki:在参数列表中再传递一个参数并不是什么大问题。放置全局变量确实是一个坏主意,并且在将来需要修改源代码时会给您带来困难(特别是在多线程处理中,全局变量在分析程序时也很难跟踪!)是的,我同意这是一个有问题的做法,并且在我的待办事项列表中进行了修复,但目前我只是想让这件事起作用。@tziki:在参数列表中再传递一个参数没什么大不了的。放置全局变量确实是一个坏主意,并且在将来需要修改源代码时会给您带来困难(特别是在多线程处理中,全局变量在分析程序时也很难跟踪!)既然你使用的是文件*,这实际上只是一个C问题而不是C++问题。你应该把文件*指针包装在单日志日志类中,并使它懒惰地初始化。有效地归结为拥有一个全局(单例)对象,但如果使用singleton
(与使用global FILE*
@bits相比,它更整洁:单例日志类如何帮助实现“多个函数……需要从一个文件读取数据”的功能?为什么单例“更整洁”一个单体似乎是一个滥用单体,因为它是一个有效的事情,要想在一个程序中打开多个文件。因为你使用的是文件*,这只是一个C问题而不是C++问题。你应该把你的文件*指针放在一个单独的日志记录类中,然后做它延迟初始化。实际上可以归结为拥有一个全局(单例)对象,但如果您使用singleton
(与使用global FILE*
@bits相比,它要整洁得多:单例日志类如何帮助实现“多个函数……需要从一个文件读取数据”的功能?为什么是单例“更整洁"而不是一个全局对象?试图将一个类似文件*
的对象作为一个单例对象似乎是对单例对象的滥用,因为想要在一个程序中打开多个文件显然是一件有效的事情。公平地说,全局变量解决方案是问题所要求的。公平地说,全局变量解决方案是问题所要求的@Dacav:全局变量是问题的一部分。SCFrench没有在他的解决方案中引入它,他只是修复了它的初始化。@Dacav:全局变量是问题的一部分。SCFrench没有引入