标签: stringstream

stringstream clear和str有什么区别

我只是想知道clear()和str("")之间的区别是什么;

例如:

stringstream ss("Stack Overflow");

ss.clear();

ss.str("");
Run Code Online (Sandbox Code Playgroud)

我想知道潜在的技术差异.

c++ stringstream

6
推荐指数
2
解决办法
2408
查看次数

将std :: cout重定向到自定义编写器

我想使用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++ iostream stream stringstream streambuf

6
推荐指数
3
解决办法
9303
查看次数

使用stringstream获取字节值

我有这个(不正确的)示例代码,用于从字符串流中获取值并将其存储在字节大小的变量中(它需要在单个字节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?

谢谢!

c++ iostream stringstream

6
推荐指数
1
解决办法
7516
查看次数

有没有更有效的方法从流中设置std :: vector?

目前,我设置的值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相反,我会更好吗?

c++ stl stringstream ostringstream stdvector

6
推荐指数
2
解决办法
5757
查看次数

如何检查stringstream >> string是否会在字符串上放什么?

例如,在解析文本文件时,有时这个文件有这样的东西:

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 >>之后仍然是空的,似乎很蹩脚.

c++ string stringstream

6
推荐指数
1
解决办法
1万
查看次数

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文档但我无法找到解释为什么会发生这种情况的原因.这是编译器特定的行为,还是我可以依赖于此?

c++ stringstream

6
推荐指数
1
解决办法
6040
查看次数

流的内容和字符串`str()`之间的区别是否返回?

我正在使用一小段生成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 来比较行输出,但没有发现明显的差异...... …

c++ string stringstream

6
推荐指数
1
解决办法
632
查看次数

std :: stringstream与直接输出缓冲区/字符串结果访问,避免复制?

是否存在规范/公共/免费实现变体,std::stringstream每次调用时我都不会为完整的字符串副本付费str()?(可能通过c_str()在骨科中提供直接成员?)

我在这里发现了两个问题:

并且"当然"不推荐使用的std::strstream类确实允许直接缓冲区访问,尽管它的界面非常古怪(除了它被弃用).

似乎人们可以找到几个代码示例来解释如何自定义std::streambuf以允许直接访问缓冲区 - 我没有在实践中尝试过,但它似乎很容易实现.

我的问题实际上是两个方面:

  • 有没有更深层次的原因std::[o]stringstream(或者更确切地说,basic_stringbuf)不允许直接缓冲区访问,而只能通过整个缓冲区的(昂贵)副本进行访问?
  • 鉴于实现这一点似乎很容易,但并非微不足道,是否有任何通过boost或其他来源提供的varaint,包装此功能?

注意:副本的性能损失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)

c++ iostream stl stringstream

6
推荐指数
1
解决办法
1653
查看次数

C++ stringstream inline

我想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<<的工作很好.

我该如何解决?谢谢!

c++ stl stringstream

6
推荐指数
1
解决办法
1431
查看次数

从cin读取getline到stringstream(C++)

所以我试图从标准输入(使用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?任何帮助在这里将不胜感激.

c++ stringstream cin getline ostream

6
推荐指数
2
解决办法
3万
查看次数