我对 c++ 相当陌生,如果有更好/更优化的方法来使用调用 ifstream 和字符串流的函数,我想征求意见/建议。
我有一个包含 150 行和 8 列结构的文档(一个简化了值的小子集):
5.43e-08 0.0013 0.0105 0.013 0.026 0.068 0.216 0.663
6.98e-08 0.0004 0.0188 0.022 0.103 0.854 0 0
7.31e-08 0.0004 0.0125 0.017 0.074 0.895 0 0
5.82e-08 0.0006 0.0596 0.075 0.150 0.713 0 0
每行的编号代表一个位置(pos 1 ... pos 150),每列是质量的概率(Qual1 .. Qual8)。我的目标是从代表质量分布的每一行中采样,为所有 150 个位置创建一个质量字符串。我创建了一个可以做到这一点的函数。
std::string Qual(std::ifstream &infile){
std::string line;
double Q_1,Q_2,Q_3,Q_4,Q_5,Q_6,Q_7,Q_8;
char Qualities[] = {'1', '2', '3', '4' ,'5', '6', '7','8','\0'};
std::string Read_qual;
while (std::getline(infile, line)){
std::stringstream ss(line);
ss >> Q_1 >> Q_2 >> Q_3 >> Q_4 >> Q_5 >> Q_6 >> Q_7 >> Q_8;
std::srand(std::time(nullptr));
std::random_device rd;
std::default_random_engine gen(rd());
std::discrete_distribution<> d({Q_1,Q_2,Q_3,Q_4,Q_5,Q_6,Q_7,Q_8});
Read_qual += Qualities[d(gen)];
}
return Read_qual;
}
问题是我必须重复使用这个函数来创建多个基于其他输入的分布。据我在这里看到的堆栈溢出,我必须使用 .clear() 和 seekq 来保持文件打开但仍然使用它。
int main(int argc,char **argv){
std::ifstream infile("Freq.txt");
std::cout << Qual(infile) << std::endl;
infile.clear();
infile.seekg(0);
std::cout << "-------" << std::endl;
std::cout << Qual(infile);
return 0;
}
我的问题是:在使用 c++ 时是否有更理想的解决方案来完成此任务。就像任何可能更快的功能一样。任何人都可以提出任何建议吗?继续打开和关闭文件会更好吗?