为什么ostringstream没有清空?

时间:2013-06-27 14:01:16

标签: c++ flush ostringstream

我正在尝试通过ostringstream将int转换为字符串,但每次将数据放入流中时,它都会保留在流中。我已尝试同时使用.flush()<<endl,但该流不会清空。 This question表明我并没有真正得到溪流(我没有,仍在努力),而我正在做的事情是笨蛋和不必要的。

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... 

5 个答案:

答案 0 :(得分:3)

std::ostringstream是字符串的编写器接口。使用<<附加到字符串,flush是多余的,因为字符串没有缓冲区。

要更改流写入的字符串(例如更改为空字符串),请使用其str()成员函数的设置版本:

strs << product;
string str = strs.str();
strs.str(""); // reset string written into

答案 1 :(得分:1)

到目前为止,处理此问题的最简单方法是每次希望它为空时创建一个新的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,所以你可以使用它而不是自己编写。

在将longi相乘之前,请注意投降到j。鉴于您目前正在使用的值,这不是绝对必要的,但longproduct的使用也不是必需的。假设您可能使用product可能比int更大的值,则必须使用强制转换。如果没有它,你就会在两个int上进行乘法,这自然会产生int个结果。 然后你正在接受这个结果(如果它太大而无法容纳int)并且将其转换为long,那么结果已经溢出。通过在乘法之前将其中一个操作数转换为long,您可以强制在long s上执行乘法,防止溢出(至少假设long足够大到保持结果)。

答案 2 :(得分:0)

清除ostringstream.buffer:

strs.str("");

答案 3 :(得分:0)

要重置std::ostringstream,只需指定一个新缓冲区:

std::ostringstream oss;
// ...
oss.str(std::string());

但是,大多数时候没有必要,因为你可以在最窄的范围内定义/初始化你的字符串流,以便自动获得。在您的情况下,您可能希望在外部for循环中定义它。

答案 4 :(得分:0)

将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;
}