在循环中和循环外写入文件的一般问题:
假设我有以下代码:
# include <iostream>
# include <string>
# include <fstream>
# include <sstream>
using namespace std;
void printToFile(string name, double **Array)
{
ofstream myfile;
myfile.open(name);
for (unsigned int m=0; m<5; m++)
{
for (unsigned int n=0; n<10; n++)
{
myfile << Array[m][n] << " ";
}
}
myfile.close();
}
int main()
{
int i,j;
double **Arr;
string str;
ostringstream oss;
for (i=0; i<5; i++)
{
for (j=0; j<10; j++)
{
// some calculation that yields Arr with size [5][10]
str="";
oss << "Arr_j_"<<j+1<<"_i_"<<i+1<<".txt";
str = oss.str();
printToFile(str,Arr);
}
}
return 0;
}
我似乎无法正确获取文件的名称,我得到的是:
Arr_j_1_i_1.txtArr_j_2_i_1.txtArr... etc
此外,我的代码运行完成,但输出文件停在i=2
,我也很感激有关使用哪种流量的评论(ostream
,fstream
,sstream
,等...)
答案 0 :(得分:3)
每次迭代后,您永远不会清除ostringstream
。要自动执行此操作,您只需将oss
声明移动到循环中即可。这样,在每个循环之后,流将被销毁,并且您将在下一次迭代时以新流开始。
for (i=0; i<5; i++)
{
for (j=0; j<10; j++)
{
ostringstream oss;
// some calculation that yields Arr with size [5][10]
oss << "Arr_j_"<<j+1<<"_i_"<<i+1<<".txt";
printToFile(oss.str(),Arr);
}
}
我还删除了str=""
和str = oss.str();
,因为它不需要。您可以使用oss.str()
作为printToFile
的参数,并删除str
。
我不确定它是否会更快但你可以避免使用任何类型的stringstream并使用std::to_string
在函数调用中构造字符串以将索引转换为字符串。看起来像
for (i=0; i<5; i++)
{
for (j=0; j<10; j++)
{
// some calculation that yields Arr with size [5][10]
printToFile("Arr_j_" + std::to_string(j+1) + "_i_" + std::to_string(i+1) + ".txt", Arr);
}
}
答案 1 :(得分:0)
在循环中声明str和oss,你没有清除oss
for (i=0; i<5; i++)
{
for (j=0; j<10; j++)
{
// some calculation that yields Arr with size [5][10]
string str;
ostringstream oss;
oss << "Arr_j_"<<j+1<<"_i_"<<i+1<<".txt";
str = oss.str();
printToFile(str,Arr);
}
}