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 в целое число.