如何在C ++中管理'ostringstream'对象?

时间:2011-11-07 21:57:32

标签: c++ ostringstream

这是来自C ++程序的一段代码。

string TwoSeries::getArrays()
{
    ostringstream outIndex;
    ostringstream outValueA;
    ostringstream outValueB;
    string stA;
    string stB;
    string valueA;
    string index;
    int *arA;
    int * arB;
    string valueB;
    for(int x = 0; x < 200; x++)  
    {         

        outIndex << x;
        index = outIndex.str();



         arA = getArrayA();
        outValueA << *(arA + x);
        valueA = outValueA.str();


          arB = getArrayB();
        outValueB << *(arB + x);
        valueB = outValueB.str();


        stA += index + ":" + valueA + " ";
        stB += index + ":" + valueB + " ";

    }

   // return "Series A: \n"+stA+ "\n"+"Series B: \n"+ stB;   
    return index;
}

这个函数应该返回从int转换为字符串的最后一个索引,它应该是199.但是这个对象'outIndex'将所有数字(字符串)连接成一个字符串,并给出如下结果:1234567891011121314151617。 .. 198199.绝对最后一个数字是199.并且在完全循环后强制执行该功能的内容只输出最后一个数字,而不是它所遇到的所有数字。怎么做?

3 个答案:

答案 0 :(得分:2)

您想要清除字符串流:

for(int x = 0; x < 200; x++)  
{         
    outIndex.str("");
    outValueA.str("");
    outValueB.str("");

或者,您可以采用良好的C ++样式并在循环中本地声明它们:

for(int x = 0; x < 200; x++)  
{         
    ostringstream outIndex;
    ostringstream outValueA;
    ostringstream outValueB;

当你在它时,你也可以移动其余部分。或者......重写如下:

string TwoSeries::getArrays()
{
    string index;

    int x;
    for(x = 0; x < 200; x++)  
    {         
        ostringstream osA, osB;

        osA << x << ":" << *(getArrayA() + x) + " ";
        osB << x << ":" << *(getArrayB() + x) + " ";

        string stA = osA.str(); // warning: value isn't used
        string stB = osB.str(); // warning: value isn't used
    }

    ostringstream osA, osB;
    outIndex << (x-1); // previous index
    return outIndex.str();
}

请注意,您正在进行大量冗余工作,而且现在所有这些值都没有被使用。也许您有更多未显示的代码:)

答案 1 :(得分:1)

将循环中仅需要的对象移动到循环中。这导致它们在每次迭代时重置:

string TwoSeries::getArrays()
{
    string stA;
    string stB;
    for(int x = 0; x < 200; x++)  
    {
        ostringstream outIndex;  //this stream used all three times. 
        outIndex << x;
        string index = outIndex.str();

        int *arA;
        arA = getArrayA();
        outIndex << *(arA + x);
        string valueA = outIndex.str();

        int * arB;
        arB = getArrayB();
        outIndex << *(arB + x);
        string valueB = outIndex.str();

        stA += index + ":" + valueA + " ";
        stB += index + ":" + valueB + " ";
    }

   return "Series A: \n"+stA+ "\n"+"Series B: \n"+ stB;   
}

您的问题是每次迭代都将索引添加到outIndex,但从未重置它,导致它慢慢构建所有使用过的索引的列表。对于其他两个字符串流也会发生这种情况。 .str() 清除流。

答案 2 :(得分:1)

for(int x = 0; x < 200; x++)  
{         
    outIndex << x;
}

将x连续连接到outIndex。我认为您需要执行以下操作:

for(int x = 0; x < 200; x++)  
{         
    outIndex << x;

    ....

    outIndex.str("");
}

每次循环都会清除outIndex。