如何解决多次运行ifstream和stringstream函数
我对c ++还是很陌生,如果有更好/更优化的方法来使用调用ifstream和string stream的函数,我想寻求建议/建议。
我有一个文档,该文档的结构包含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
每行的数字表示一个位置(位置1 ...位置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_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 ++时是否有更理想的解决方案来完成此任务?像任何可能更快的功能。有人可以提出任何建议吗? 继续打开和关闭文件会更好吗?
解决方法
让我们尝试缓存
完全未经测试的不完整代码
struct row { // your type that goes into the distribution
double Q_1,Q_2,Q_3,Q_4,Q_5,Q_6,Q_7,Q_8;
};
using QualData = std::vector<row>; // typedef
QualData ReadData(std::ifstream &infile) {
std::string line;
double Q_1,Q_8;
char Qualities[] = {'1','2','3','4','5','6','7','8','\0'};
std::string Read_qual;
QualData 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;
qual.emplace_back(Q_1,Q_8);
}
return qual;
}
... do qual
int main(int argc,char **argv){
std::ifstream infile("Freq.txt");
auto qualData = ReadData(infile);
std::cout << Qual(qualData) << std::endl;
std::cout << "-------" << std::endl;
std::cout << Qual(qualData);
return 0;
}
您可以想象其他需要改变的地方。
,我的建议:
std::string Qual(double *a)
{
std::string line;
char Qualities[] = {'1','\0'};
std::string Read_qual;
std::srand(std::time(nullptr));
std::random_device rd;
std::default_random_engine gen(rd());
std::discrete_distribution<> d({a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
Read_qual += Qualities[d(gen)];
return Read_qual;
}
和main()
int main()
{
std::ifstream infile("Freq.txt");
double alldata[150][8];
for (int i=0,i<150; i++)
for (int j=0; j<8; j++) infile >> alldata[i][j];
infile.close();
for (int idx = 0; idx < 2000; idx++)
{
for (int row = 0; row < 150; row++)
std::cout << Qual(alldata[row]) << std::endl;
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。