Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建全局文件*对象?_C++_C - Fatal编程技术网

C++ 创建全局文件*对象?

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”);

我正在构建一个程序,它有几个函数需要从文件中读取数据。由于函数的使用相当频繁,每次调用打开和关闭文件都会非常耗时,因此我的计划是将file*对象设置为全局,并在整个程序期间打开文件。显然,这是不可能的,因为:

#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没有引入