Я пытаюсь преобразовать int в строку через ostringstream, но каждый раз, когда я помещаю данные в поток, он остается в потоке. Я пытался использовать оба .flush()
а также <<endl
но поток никогда не опустошается. Этот вопрос предполагает, что я действительно не получаю потоки (я не все еще работаю над этим), и то, что я делаю, — это hokum и не нужно.
int main()
{
long int max = 0;
ostringstream strs;
for(int i=10;i<100; i++){
for(int j = i; j < 100; j++){
long int product = i*j;
strs.flush();
strs <<product;
string str = strs.str();
cout<<str;
int size = str.length();
}
}
cout<<max;
return 0;
}
В настоящее время я получаю вывод
100/100
110/100110
120/100110120
130/100110120130
etc...
вместо
100/100
110/110
120/120
130/130
etc...
std::ostringstream
интерфейс для записи строки С помощью <<
добавляет к строке, и flush
является лишним, так как строка не имеет буфера.
Чтобы изменить строку, в которую записывает поток (например, на пустую), используйте установочную версию его str()
функция-член:
strs << product;
string str = strs.str();
strs.str(""); // reset string written into
Безусловно, самый простой способ справиться с этим — создать новый stringstream
объект каждый раз, когда вы хотите, чтобы он был пустым. В большинстве случаев (включая ваш) это легко сделать, просто выпустив существующий объект из области видимости и получив новый объект, который создается при повторном вводе правильной области.
Лично я бы сделал эту работу, переместив весь код из int
в std::string
в функцию, которая имеет локальный объект stringstream, поэтому «чистый» поток строк создается каждый раз, когда вы вызываете функцию, и уничтожается при выходе из нее.
std::string to_string(long int in) {
std::stringstream buffer; // New/empty every time this function is called
buffer << in;
return buffer.str();
} // here buffer goes out of scope and is destroyed.
int main()
{
long int max = 0;
for(int i=10;i<100; i++){
for(int j = i; j < 100; j++) {
long int product = static_cast<long>(i)*j;
std::string str = to_string(product);
// presumably:
// if (product > max) max = product;
std::cout << str;
// you never seem to use this:
//int size = str.length();
}
}
cout<<max;
return 0;
}
Пара замечаний: если ваш компилятор достаточно свежий, он может уже иметь std::to_string
в его стандартной библиотеке, так что вы можете просто использовать это вместо того, чтобы писать свою собственную.
Также обратите внимание на приведение к long
перед умножением i
а также j
, Учитывая значения, которые вы используете прямо сейчас, это не является строго необходимым, но и использование long
за product
, Предполагая, что вы можете использовать значения, где product
может быть больше, чем уместится в int
, актерский состав становится необходимым. Без этого вы делаете умножение на два int
с, который, естественно, производит int
результат. затем вы берете этот результат (который уже переполнен, если он слишком велик, чтобы поместиться в int
) и преобразовать его в долго. Путем преобразования одного из операндов в long
перед умножением вы заставляете умножение выполняться на long
s, предотвращая переполнение (по крайней мере, предполагая, long
достаточно большой, чтобы держать результат).
Поместите ostringstream в область видимости, чтобы он создавался заново при каждом входе. В вашем случае это будет:
int main()
{
long int max = 0;
{
ostringstream strs;
for(int i=10;i<100; i++){
for(int j = i; j < 100; j++){
long int product = i*j;
strs.flush();
strs <<product;
string str = strs.str();
cout<<str;
int size = str.length();
}
}
}
cout<<max;
return 0;
}
очистите ostringstream.buffer следующим образом:
strs.str("");
Сбросить std::ostringstream
Вы просто назначаете новый буфер:
std::ostringstream oss;
// ...
oss.str(std::string());
Тем не менее, в большинстве случаев в этом нет необходимости, поскольку вы можете определить / инициализировать ваш поток строк в самом узком объеме, чтобы получить его автоматически. В вашем случае вы, вероятно, захотите определить его внутри внешнего цикла for.