gpt4 book ai didi

c++ - 如何从函数中读取文件中的数据

转载 作者:行者123 更新时间:2023-11-28 04:40:12 26 4
gpt4 key购买 nike

我想让我的代码更有效率,特别是从文本文件中读取数据。这是它现在的样子的快照:

values V(name); 
V.population = read_value(find_line_number(name, find_in_map(pop, mapping)));
V.net_growth = read_value(find_line_number(name, find_in_map(ngr, mapping)));
... // and so on

基本上,read_value 函数创建一个ifstream 对象,打开文件,读取一行数据,然后关闭文件连接。这种情况发生了很多次。我想要做的是打开文件一次,将需要的每一行读入结构,然后关闭文件连接。

这是创建带有参数的 values 结构函数:

static values create_struct(std::string name, std::map<std::string, int> mapping) {
values V(name);
V.population = read_value(find_line_number(name, find_in_map(pop, mapping)), file);
V.net_growth = read_value(find_line_number(name, find_in_map(ngr, mapping)), file);
// more values here
return V;
}

调用create_struct的函数如下所示:

void initialize_data(string name) {
// read the appropriate data from file into a struct
value_container = Utility::create_struct(name, this->mapping);
}

我正在考虑在函数 initialize_data 中定义 ifstream 对象。根据显示的有关我的程序的内容,这是创建文件对象、打开连接、读取值然后关闭连接的最佳位置吗?另外,我是否需要将 ifstream 对象传递到 create_values 结构中,如果需要,按值、引用或指针传递?

最佳答案

简短的回答是首先创建您的 ifstream 对象并将其作为引用传递给您的解析器。请记住,在您离开函数之前或开始阅读时,将流搜索到开头。

RAII 要做的事情是创建一个包装器对象,当它超出范围时自动执行此操作。

class ifStreamRef{
ifStreamRef(std::ifstream& _in) : mStream(_in){}
~ifStreamRef(){mStream.seekg(0);}
std::ifstream& mStream;
}

然后您在输入将读取 fstream 的方法时创建一个包装器实例。

void read_value(std::ifstream& input, ...){
ifStreamRef autoRewind(input);
}

或者,因为 Ctor 可以进行转换...

void read_value(ifStreamRef streamRef, ...) {
streamRef.mStream.getLine(...);
}

std::ifstream 本身遵循 RAII,因此当您的流超出范围时它会为您关闭()流。


长的答案是你应该阅读依赖注入(inject)。不要在可以共享的对象/函数内部创建依赖关系。有很多关于依赖注入(inject)和依赖倒置的视频和文档。

基本上,构造您的对象所依赖的对象并将它们作为参数传递。

注入(inject)现在依赖于您传入的对象的接口(interface)。因此,如果您将 ifStreamRef 类更改为充当接口(interface):

class ifStreamRef{
ifStreamRef(std::ifstream& _in) : mStream(_in){}
~ifStreamRef(){mStream.seekg(0);}

std::string getLine(){
// todo : mStream.getLine() + return "" on error;
}
bool eof() { return mStream.eof(); }
std::ifstream& mStream;
}

稍后您可以更改引用 vector<string>& 的内部实现而不是 ifstream ...

class ifStreamRef{
ifStreamRef(std::vector<string>& _in) : mStream(_in), mCursor(0){}
~ifStreamRef(){}

std::string getLine(){
// todo : mStream[mCursor++] + return "" on error;
}
bool eof() { return mCursor >= mStream.size(); }
std::vector<string>& mStream;
size_t mCursor;
}

我把一些事情简单化了。

关于c++ - 如何从函数中读取文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50355838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com