Как управлять объектом "ostringstream" в C++?
Это фрагмент кода из программы на 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 ответа
Вы хотите очистить строковые потоки:
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();
}
Обратите внимание, что вы выполняете много лишней работы, и сейчас все эти значения не используются. Возможно, у вас есть больше кода, который вы не показали:)
for(int x = 0; x < 200; x++)
{
outIndex << x;
}
Будет непрерывно объединять x в outIndex. Я думаю, что вам нужно сделать следующее:
for(int x = 0; x < 200; x++)
{
outIndex << x;
....
outIndex.str("");
}
Это будет очищать индекс каждый раз через цикл.
Переместите объекты, которые нужны только в цикле, в цикл. Это заставляет их сбрасывать каждую итерацию:
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()
не очищает поток