循环写入文件cpp
Write to file in a loop cpp
循环内和循环外写入文件的一般问题:
假设我有以下代码:
# 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
,我也希望能对使用哪个 Steam 提出意见(ostream
、fstream
、 sstream
, 等等...)
您永远不会在每次迭代后清除 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
.
我不确定它是否会更快,但您可以避免使用任何类型的字符串流,并使用 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);
}
}
在循环内声明 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);
}
}
循环内和循环外写入文件的一般问题:
假设我有以下代码:
# 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
,我也希望能对使用哪个 Steam 提出意见(ostream
、fstream
、 sstream
, 等等...)
您永远不会在每次迭代后清除 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
.
我不确定它是否会更快,但您可以避免使用任何类型的字符串流,并使用 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);
}
}
在循环内声明 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);
}
}