如何将内容附加到stringstream类型对象?

时间:2012-01-09 09:24:56

标签: c++

我正在使用stringstream的对象如下:

#include<iostream>
#include <istream>

using namespace std;
int main()
{
    sting str="my.string";

    std::stringstream message("HI this is firet line from initialization");

    message << " second line " << " Continueing second line";

    message << ", Add values: ";

    message << str ;


    std::cout<<"message value is :"<<message.str()<<std::endl;

    return 0;
}

使用上面的代码,它会产生如下错误:

 error: variable 'std::stringstream message' has initializer but incomplete type
添加“#include”头文件后,

上面的错误就解决了。但是当我打印出消息的价值时。它变得不完整了。即我得到的消息的价值如下:

消息值为:第二行继续第二行,添加值:my.string

关于为什么第一行在输出中删除的任何建议? 提前致谢

2 个答案:

答案 0 :(得分:12)

stringstream在不同的标头中定义:

#include <sstream>

另外,如果你想要初始内容坚持下去,你会想要这样的东西:

std::stringstream message("HI this is firet line from initialization",
                                             ios_base::app | ios_base::out);

其中app表示每个输出操作都写入流的末尾。请参阅here

答案 1 :(得分:6)

在弗拉克回答之后,我只是尝试了以下内容(在GCC 4.7.0中,mingw在Windows 7上:x86_64-w64-mingw32)

std::stringstream ss("initial string", ios_base::app | ios_base::out);
ss << " appended string";

但之后,ss.good()会立即返回false,这很令人困惑,因为ss.str()仍然返回我预期的附加字符串"initial string appended string"。我终于偶然发现http://www.cplusplus.com/reference/sstream/stringstream/stringstream/的以下一行:

  

也可以指定ios_base :: openmode类型的其他值(例如ios_base :: app),但它们是否对stringstream对象有影响取决于库的实现。

阅读&#34;标准&#34; ios_base::标记,我试过这个,它给了我预期的附加流内容,ss.good()返回true

std::stringstream ss("initial string", ios_base::ate | ios_base::in | ios_base::out);

[P.S。我宁愿发布这篇文章作为对Vlad的答案的评论,因为它不是一个直接的答案;它只是评论他在使用operator <<时保留以前的流内容的建议。由于我没有足够的声誉来评论他的答案,但我认为这对其他遇到此问题的人有用,我将其作为答案发布。]