循环写入文件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 提出意见(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);
        } 
    }