我想使用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 - 这些东西已经超出了我的想象.
任何人都可以告诉我在c ++中使用字符串流的一些实际例子,即使用流插入和流提取操作符输入和输出到字符串流?
我在我的整个项目中使用stringstream,它有30多个文件.我最近克服了一个由stringstring引起的问题,我将double解析为stringstream并且精度丢失了.所以现在我想为所有文件设置精度.有没有办法在全局范围内设置它,这样我就不需要在每个文件的每个地方进行更改.有人建议我看看它是否可以使用locale.
请帮我解决这个问题,如果你有代码或任何代码链接,它会更有用.
我有这个(不正确的)示例代码,用于从字符串流中获取值并将其存储在字节大小的变量中(它需要在单个字节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?
谢谢!
我们知道,当插入\n文件流时,系统的相应行尾序列将被写入文件(例如,\r\n用于Windows).是否在std::stringstream结果中插入一个结束于系统适当的行尾序列被写入字符串?例如:
#include <sstream>
int main()
{
std::ostringstream oss;
oss << std::endl;
std::string endlineSequence = oss.str();
bool isWindows = enlineSequence == "\r\n";
bool isOldMac = endlineSequence == "\r";
bool isUnix = endlineSequence == "\n";
// Will this work???
}
Run Code Online (Sandbox Code Playgroud) 我正在学习c ++并且得到了一个项目来发送一个pascal的三角形输出(在n行计算之后).得到这样的输出,存储在一个字符串流"缓冲区"中
1
1 1
1 2 1
1 3 3 1
Run Code Online (Sandbox Code Playgroud)
但我想要的是相当的
1
1 1
1 2 1
1 3 3 1
Run Code Online (Sandbox Code Playgroud)
我的想法是:计算最后一行和当前行长度的差异(我知道最后一行是最长的).然后使用空格填充每一行(行长度差的一半).我现在的问题是:
不知怎的,我觉得我没有使用stringstream的最佳方式.
所以这是一个很常见的问题:如何解决这个问题,如果可能的话,使用stringstreams - 怎么样?
目前,我设置的值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相反,我会更好吗?
此函数从字符串中读取双精度数组:
vector<double> parseVals(string& str) {
stringstream ss(str);
vector<double> vals;
double val;
while (ss >> val) vals.push_back(val);
return vals;
}
Run Code Online (Sandbox Code Playgroud)
当使用包含100万个数字的字符串调用时,该函数需要7.8秒才能执行(Core i5,3.3GHz).这意味着花费25000个CPU周期来解析一个NUMBER.
user315052已经指出相同的代码在他的系统上运行速度快了一个数量级,并且进一步的测试显示了不同系统和编译器之间的非常大的性能差异(另见user315052的答案):
1. Win7, Visual Studio 2012RC or Intel C++ 2013 beta: 7.8 sec
2. Win7, mingw / g++ 4.5.2 : 4 sec
3. Win7, Visual Studio 2010 : 0.94 sec
4. Ubuntu 12.04, g++ 4.7 : 0.65 sec
Run Code Online (Sandbox Code Playgroud)
我在Boost/Spirit库中找到了一个很好的选择.代码安全,简洁,速度极快(VC2012上为0.06秒,比stringstream快130倍).
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
vector<double> parseVals4(string& str) {
vector<double> vals;
qi::phrase_parse(str.begin(), str.end(),
*qi::double_ >> …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何重用ostringstream?
我一直在使用std::ostringstream转换float和int值到字符串但我无论如何都找不到重用实例.为了说明我的意思,以下是我尝试用来清除流的方法
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream stream;
stream << "Test";
cout << stream.str() << endl;
stream.flush();
stream << "----";
cout << stream.str() << endl;
stream.clear();
stream << "****";
cout << stream.str() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
生成输出
Test
Test----
Test----****
Run Code Online (Sandbox Code Playgroud)
这给了我一个问题,因为我不得不创建许多ostringstream浪费的实例.显然clear(),flush()不要做我需要的,所以有办法做到这一点吗?我查看了http://www.cplusplus.com/reference/iostream/ostringstream/上的文档,但似乎没有任何内容可以满足我的需求.有没有办法重置或清除流?
在不使用boost的情况下,从字符串流中提取一组字符的正确c ++ 11方法是什么?
如果可能的话,我想在没有复制的情况下这样做,因为使用它的地方是关键数据循环.但是,似乎std :: string不允许直接访问数据.
例如,下面的代码执行字符串流中的子字符串副本:
inline std::string left(std::stringstream ss, uint32_t count) {
char* buffer = new char[count];
ss.get(buffer, count);
std::string str(buffer); // Second copy performed here
delete buffer;
return str;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是矢量初始化每个角色,所以我想避免这种情况.
此外,这需要传递给一个接受const char*的函数,所以现在运行后我被迫做一个.c_str().这也是副本吗?
能够传回一个const char*会很好,但这似乎违背了"适当的"c ++ 11风格.
要了解我想要做什么,这里"有效"我想用它:
fprintf( stderr, "Data: [%s]...", left(ststream, 255) );
Run Code Online (Sandbox Code Playgroud)
但是c ++ 11强制:
fprintf( stderr, "Data: [%s]...", left(str_data, 255).c_str() );
Run Code Online (Sandbox Code Playgroud)
我在这里制作了多少份该字符串?
如何将它减少到只有一个副本的字符串流?