我只是想知道clear()和str("")之间的区别是什么;
例如:
stringstream ss("Stack Overflow");
ss.clear();
ss.str("");
Run Code Online (Sandbox Code Playgroud)
我想知道潜在的技术差异.
我想使用Mr-Edd的iostreams文章中的这个片段在某处打印std :: clog.
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
int main()
{
std::ostringstream oss;
// Make clog use the buffer from oss
std::streambuf *former_buff =
std::clog.rdbuf(oss.rdbuf());
std::clog << "This will appear in oss!" << std::flush;
std::cout << oss.str() << '\\n';
// Give clog back its previous buffer
std::clog.rdbuf(former_buff);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,在一个主循环中,我会做类似的事情
while (! oss.eof())
{
//add to window text somewhere
}
Run Code Online (Sandbox Code Playgroud)
这是ostringstream文档,但我无法理解这样做的最佳方法.我有一个显示文本的方法,我只想用ostringstream中的任何数据调用它.
将发送到std :: clog的任何内容重定向到我选择的方法的最简单/最好的方法是什么?它是如上所述,并填写while!eof部分(不确定如何),或者是否有更好的方法,比如通过在调用我的方法的地方重载一些'commit'运算符?我喜欢快速简单,我真的不想开始定义接收器,就像文章那样使用boost iostreams - 这些东西已经超出了我的想象.
我有这个(不正确的)示例代码,用于从字符串流中获取值并将其存储在字节大小的变量中(它需要在单个字节var中,而不是int):
#include <iostream>
#include <sstream>
using namespace std;
int main(int argc, char** argv)
{
stringstream ss( "1" );
unsigned char c;
ss >> c;
cout << (int) c << endl;
}
Run Code Online (Sandbox Code Playgroud)
我运行它时的输出是49,这不是我想看到的.显然,这被视为char而不是简单的数值.什么是c ++最常用的方法是在c转换为int时保持1而不是49?
谢谢!
目前,我设置的值std::vector<char>从std::ostringstream如下:
void
foo(std::vector<char> &data, std::stringstream &stream) {
data = std::vector<char>(stream.str().begin(), stream.str().end());
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更有效的方法在C++中使用STL或者我在这里给出的方法是否合适?std::stringstream相反,我会更好吗?
例如,在解析文本文件时,有时这个文件有这样的东西:
keyword a string here
keyword another string
keyword
keyword again a string
Run Code Online (Sandbox Code Playgroud)
请注意,第3行有一个空字符串(无空格或空格).问题是当你执行stringstream >> laststring,而stringstream有一个空字符串(null或只是空格)时,它不会覆盖"laststring" ",它什么都不做.无论如何都要事先检查这种情况?我不想创建一个临时空字符串只是为了检查它在stringstream >>之后仍然是空的,似乎很蹩脚.
我有这个代码:
std::string s = "\n\n\n\n+\n\n\n+";
std::stringstream serializedDataStream(s);
std::string plusCharacter, plusCharacter2;
serializedDataStream >> plusCharacter ;
cout << "plusCharacter "<<plusCharacter << "\n";
serializedDataStream >> plusCharacter2 ;
cout << "plusCharacter "<<plusCharacter2;
//OUTPUT:
// plusCharacter +
// plusCharacter +
Run Code Online (Sandbox Code Playgroud)
这意味着stringsteam >>操作员跳过了新行.我查看了std::stringstream文档但我无法找到解释为什么会发生这种情况的原因.这是编译器特定的行为,还是我可以依赖于此?
我正在使用一小段生成PDF文件的代码,我在互联网上找到了这些代码,并尝试(轻柔地)优化它,因为文件的创建需要很长时间.在分析之后,我将其缩小到以下代码:
std::ostringstream tmp;
tmp << std::hex << std::uppercase << std::setfill('0') <<
std::setw(2) << r << " " <<
std::setw(2) << g << " " <<
std::setw(2) << b;
out << tmp.str();
Run Code Online (Sandbox Code Playgroud)
在一个紧密的循环中发现,与out作为一个ostringstream之前它写入文件,基本上包含整个PDF内容.我发现那tmp.str()是在该循环中花费最多时间的行,并且在查找str()将返回流的底层字符串的C++引用时看到了.
然后,我想删除该副本并直接使用out会更快.所以我倾倒tmp并直接做了:
out << std::hex << std::uppercase << std::setfill('0') <<
std::setw(2) << r << " " <<
std::setw(2) << g << " " <<
std::setw(2) << b;
Run Code Online (Sandbox Code Playgroud)
但现在,生成的PDF文件被视为"已损坏",无法通过PDF阅读器打开,而前一个可能是.我使用两种方法(使用tmp流和没有)创建PDF 来比较行输出,但没有发现明显的差异...... …
是否存在规范/公共/免费实现变体,std::stringstream每次调用时我都不会为完整的字符串副本付费str()?(可能通过c_str()在骨科中提供直接成员?)
我在这里发现了两个问题:
并且"当然"不推荐使用的std::strstream类确实允许直接缓冲区访问,尽管它的界面非常古怪(除了它被弃用).
似乎人们可以找到几个代码示例来解释如何自定义std::streambuf以允许直接访问缓冲区 - 我没有在实践中尝试过,但它似乎很容易实现.
我的问题实际上是两个方面:
std::[o]stringstream(或者更确切地说,basic_stringbuf)不允许直接缓冲区访问,而只能通过整个缓冲区的(昂贵)副本进行访问?注意:副本的性能损失str()是非常可测量的(*),因此当我到目前为止看到的用例实际上从不需要从stringstream返回的副本时,必须为此付费似乎很奇怪.(如果我需要副本,我总是可以在"客户端"进行.)
(*):使用我们的平台(VS 2005),我在发布版本中测量的结果是:
// tested in a tight loop:
// variant stream: run time : 100%
std::stringstream msg;
msg << "Error " << GetDetailedErrorMsg() << " …Run Code Online (Sandbox Code Playgroud) 我想std::stringstream用来创建格式化的字符串,但使用内联类,所以我没有stringstream局部变量飞来飞去.我的意思是:
#include <iostream>
#include <ostream>
#include <string>
#include <sstream>
int main(int argc, char* argv[])
{
std::string test = ((std::ostringstream&)
(std::ostringstream("") << "This is a test: " << 50.1 << "abc")
).str();
std::cout << test << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这在GCC中编译很好,但输出如下:
"0x401d0a50.1abc"
因此,似乎stringstream将第一个字符串视为指针并输出地址.随后operator<<的工作很好.
我该如何解决?谢谢!
所以我试图从标准输入(使用cin)读取这样的输入:
亚当英语85
查理数学76
埃里卡历史82
理查德科学90
我的目标是最终将每个数据块存储在我自己创建的数据结构中,因此基本上我想解析输入,因此每个数据都是单独的.由于每行输入由用户一次输入一次,因此每次我得到需要解析的整行输入.目前我正在尝试这样的事情:
stringstream ss;
getline(cin, ss);
string name;
string course;
string grade;
ss >> name >> course >> grade;
Run Code Online (Sandbox Code Playgroud)
我遇到的错误是XCode告诉我没有匹配的函数调用getline令我感到困惑.我已经包含了string库,所以我猜这个错误与使用getline读取cin到一个stringstream?任何帮助在这里将不胜感激.