我正在使用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
关于为什么第一行在输出中删除的任何建议? 提前致谢
答案 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 <<
时保留以前的流内容的建议。由于我没有足够的声誉来评论他的答案,但我认为这对其他遇到此问题的人有用,我将其作为答案发布。]