如何将内容附加到字符串流类型对象

How to append content to stringstream type object?

本文关键字:字符串 类型 对象      更新时间:2023-10-16

我正在使用字符串流的对象,如下所示:

#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 " << " Continuing 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

一旦我添加了"#包括";头文件。但是当我打印消息的值时。它越来越不完整。即,我得到的消息值如下:

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

关于为什么第一行在输出中被删除,有什么建议吗?提前感谢

stringstream在不同的标头中定义:

#include <sstream>

此外,如果你想让最初的内容保持不变,你会想要一些类似的东西:

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

其中CCD_ 2表示每个输出操作都写入流的末尾。请参见此处。

根据Vlad的回答,我刚刚尝试了以下操作(在GCC 4.7.0中,在Windows 7上为mingw: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),尽管它们是否对字符串流对象有影响取决于库实现。

在阅读了关于"标准"ios_base::标志之后,我尝试了这个,它给了我所期望的附加流内容,ss.good()返回true:

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

[p.S.我宁愿把它作为对Vlad答案的评论发布,因为这不是一个直接的答案;这只是对他在使用operator <<时保留以前流内容的建议的评论。由于我没有足够的信誉点来评论他的答案,但我认为这对其他人会有用,所以我把它作为一个答案发布。]