[英]Difference between initializations stringstream.str( a_value ) and stringstream << a_value
考虑:
std::string s_a, s_b;
std::stringstream ss_1, ss_2;
// at this stage:
// ss_1 and ss_2 have been used and are now in some strange state
// s_a and s_b contain non-white space words
ss_1.str( std::string() );
ss_1.clear();
ss_1 << s_a;
ss_1 << s_b;
// ss_1.str().c_str() is now the concatenation of s_a and s_b,
// <strike>with</strike> without space between them
ss_2.str( s_a );
ss_2.clear();
// ss_2.str().c_str() is now s_a
ss_2 << s_b; // line ***
// ss_2.str().c_str() the value of s_a is over-written by s_b
//
// Replacing line *** above with "ss_2 << ss_2.str() << " " << s_b;"
// results in ss_2 having the same content as ss_1.
问题:
stringstream.str(a_value)之间的区别是什么? 和stringstream << a_value; 而且,具体来说,为什么第一个不允许通过<<但第二个进行连接?
为什么ss_1会自动在s_a和save之间获得空白,但是我们是否需要在行中明确添加可以替换行***的
ss_2 << ss_2.str() << " " << s_b;
:
ss_2 << ss_2.str() << " " << s_b;
?
建议你阅读stringstream参考: http : //en.cppreference.com/w/cpp/io/basic_stringstream
std::stringstream::str()
替换基础字符串的内容
operator<<
数据插入流中。
您遇到的问题是因为默认情况下使用ios_base::openmode mode = ios_base::in|ios_base::out
构造std::stringstream
ios_base::openmode mode = ios_base::in|ios_base::out
这是一种非附加模式。
你对这里的输出模式感兴趣(即: ios_base::openmode mode = ios_base::out
)
std::basic_stringbuf::str(const std::basic_string<CharT, Traits, Allocator>& s)
以两种不同的方式运行,具体取决于openmode
:
mode & ios_base::ate == false
:(即: 非附加输出流):
str
将设置pptr() == pbase()
,以便后续输出将覆盖从s复制的字符
mode & ios_base::ate == true
:(即: 附加输出流):
str
将设置pptr() == pbase() + s.size()
,以便后续输出将附加到从s复制的最后一个字符
(注意,这个追加模式是新的,因为c ++ 11)
更多细节可以在这里找到。
如果您想要追加行为,请使用ios_base::ate
创建stringstream
:
std::stringstream ss(std::ios_base::out | std::ios_base::ate)
这里简单的示例应用:
#include <iostream>
#include <sstream>
void non_appending()
{
std::stringstream ss;
std::string s = "hello world";
ss.str(s);
std::cout << ss.str() << std::endl;
ss << "how are you?";
std::cout << ss.str() << std::endl;
}
void appending()
{
std::stringstream ss(std::ios_base::out | std::ios_base::ate);
std::string s = "hello world";
ss.str(s);
std::cout << ss.str() << std::endl;
ss << "how are you?";
std::cout << ss.str() << std::endl;
}
int main()
{
non_appending();
appending();
exit(0);
}
这将以上述两种不同的方式输出:
hello world
how are you?
hello world
hello worldhow are you?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.