在循环 cpp 中写入文件

Write to file in a loop cpp

本文关键字:文件 循环 cpp      更新时间:2023-10-16
循环

中和循环外写入文件的一般问题:

假设我有以下代码:

# 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停止,我也希望对使用哪种蒸汽(ostreamfstreamsstream等)发表评论。

每次迭代后,您永远不会清除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);
        } 
    }