Как управлять объектом «ostringstream» в C ++? - PullRequest
0 голосов
/ 08 ноября 2011

Это фрагмент кода из программы на 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 ]

2 голосов
/ 08 ноября 2011

Вы хотите очистить строковые потоки:

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 голос
/ 08 ноября 2011
for(int x = 0; x < 200; x++)  
{         
    outIndex << x;
}

Будет непрерывно объединять x в outIndex.Я думаю, что вам нужно сделать следующее:

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

    ....

    outIndex.str("");
}

Это будет очищать индекс каждый раз через цикл.

1 голос
/ 08 ноября 2011

Перемещение объектов, которые нужны только в цикле, в цикл.Это приводит к тому, что они сбрасываются на каждой итерации:

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() не не очищает поток.

...