Stringstream string to int
Ниже приведен код С++ с int
до string
и string
до int
. Затем он повторяет эти шаги снова. Строка stringstream
to int
stream1 >> i3;
разрушает код. Что мне здесь не хватает?
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
int i1 = 101;
int i2 = 202;
int i3 = 0;
string s1 = "";
string s2 = "";
stringstream stream1;
for (int i=0;i<2;i++)
{
//int to string
stream1.str("");
cout << "i1 " << i1 << endl;
stream1 << i1;
s1 = stream1.str();
cout << "s1 " << s1 << endl;
//int to string
cout << "i2 " << i2 << endl;
stream1.str("");
stream1 << i2;
s2 = stream1.str();
cout << "s2 " << s2 << endl;
//string to int
stream1.str("");
stream1.str(s2);
stream1 >> i3;
//line above causes s1 and s2 to get messed up during 2nd time in for loop
cout << "i3-- " << i3 << endl;
}
return 0;
}
Ответы
Ответ 1
Я проверил ваш код и смог воспроизвести проблему. Я решил это вставить .clear() перед .str("")
Посмотрите здесь: Как повторно использовать ostringstream?
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
int i1 = 101;
int i2 = 202;
int i3 = 0;
string s1 = "";
string s2 = "";
stringstream stream1;
for (int i=0;i<2;i++)
{
//int to string
stream1.clear();
stream1.str("");
cout << "i1 " << i1 << endl;
stream1 << i1;
s1 = stream1.str();
cout << "s1 " << s1 << endl;
//int to string
cout << "i2 " << i2 << endl;
stream1.clear();
stream1.str("");
stream1 << i2;
s2 = stream1.str();
cout << "s2 " << s2 << endl;
//string to int
stream1.clear();
stream1.str("");
stream1.str(s2);
stream1 >> i3;
//line above causes s1 and s2 to get messed up during 2nd time in for loop
cout << "i3-- " << i3 << endl;
}
return 0;
}
Ответ 2
Проблема заключается в том, что флаг потока EOF устанавливается при извлечении целого числа (т.е. stream1.eof()
возвращает true
), но вы никогда его не очищаете. Вставка вызова stream1.clear()
после извлечения исправляет вашу проблему.
Ответ 3
После чтения i3
из потока, бит eof потока будет установлен. Это связано с тем, что чтение целого числа из потока заставляет поток читать до тех пор, пока он не читает недигитный символ или не закончит чтение символов. Когда последнее происходит, бит eof устанавливается.
Например, я могу изменить эту строку,
stream1.str(s2);
stream1.str(s2 + " ");
поэтому, когда выполняется stream1 >> i3;
, он столкнется с недигитальным символом (''), прекратит чтение и не установит бит eof.
Перед тем, как попытаться прочитать его, вы должны отключить бит eof на .clear
или какой-либо другой метод.
Ответ 4
Я большую часть дня занимаюсь C, поэтому я просто использую atoi()
для преобразования:
#include <stdlib.h> // header for atoi()
//stream1 >> i3; // replace this for the line below
i3 = atoi(stream1.str().c_str());
cout << "i3-- " << i3 << endl;
То, что я делаю, это получить std::string
из stringstream
, и из этого, получив const char*
для использования в качестве аргумента для atoi()
, который преобразует строку C в целое число.