问题标签 [streambuf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
26458 浏览

c++ - 如何创建自己的 ostream/streambuf?

出于教育目的,我想创建一个 ostream 和流缓冲区来执行以下操作:

  1. 在执行 << myVar; 时修复字节序;
  2. 存储在双端队列容器中,而不是使用 std:cout 或写入文件
  3. 记录额外的数据,例如我做了多少次 <<、我做了多少次 .write、我写入的字节数以及我 flush() 的次数。但我不需要所有信息。

我尝试过超载,但失败了。我尝试通过做重载写入

在我的 basic_stringstream2 类中(我将粘贴 basic_stringstream 复制到我的 cpp 文件中并对其进行了修改),但代码继续使用 basic_ostream。我查看了代码,看起来我需要重载 xsputn (此页面http://www.cplusplus.com/reference/iostream/ostream上没有提到)但是我还需要重载什么?以及如何构建我的类(它需要继承什么等)?

0 投票
5 回答
10008 浏览

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

我想使用Mr-Edd 的 iostreams 文章中的这个片段在某处打印 std::clog。

所以,在主循环中,我会做类似的事情

这是ostringstream 文档,但我无法理解执行此操作的最佳方法。我有一个显示文本的方法,我只想用 ostringstream 中的任何数据调用它。

将发送到 std::clog 的任何内容重定向到我选择的方法的最简单/最佳方法是什么?是如上所述,并填写 while !eof 部分(不确定如何),还是有更好的方法,比如在某处重载一些调用我的方法的“提交”运算符?我正在寻找快速和简单的方法,我真的不想像文章那样开始使用 boost iostreams 定义接收器之类的东西——这些东西太让我头疼了。

0 投票
11 回答
52858 浏览

c++ - 将 streambuf 的内容复制到字符串

显然boost::asio::async_read不喜欢字符串,因为唯一的重载boost::asio::buffer允许我创建const_buffers,所以我坚持将所有内容读入 streambuf。
现在我想将 streambuf 的内容复制到一个字符串中,但它显然只支持写入 char* ( sgetn()),使用 streambuf 创建一个 istream 并使用getline().

有没有其他方法可以在不过度复制的情况下创建带有 streambufs 内容的字符串?

0 投票
5 回答
4958 浏览

c++ - iostream 的二进制版本

我一直在编写 iostreams 的二进制版本。它本质上允许您编写二进制文件,但让您可以控制文件的格式。示例用法:

将 my_int 写为无符号 32 位整数,并将 my_string 写为长度前缀字符串(其中前缀为 u16le)。要读回文件,您可以翻转箭头。效果很好。但是,我在设计中遇到了一个问题,我仍然对此持观望态度。所以,是时候问了。(我们做了几个假设,例如 8 位字节、2s 补码整数和 IEEE 浮点数。)

iostreams,在引擎盖下,使用streambufs。这真的是一个很棒的设计——iostreams 将 ' int' 的序列化编码为文本,并让底层的 streambuf 处理其余的。因此,您会得到 cout、fstreams、stringstreams 等。所有这些,无论是 iostreams 还是 streambufs,都是模板化的,通常在 char 上,但有时也作为 wchar。但是,我的数据是字节流,最好用' unsigned char'表示。

我的第一次尝试是基于unsigned char. std::basic_string模板足够好,但streambuf没有。我在一个名为 的类中遇到了几个问题codecvt,我永远无法遵循这个unsigned char主题。这提出了两个问题:

1)为什么一个streambuf要对这些事情负责?似乎代码转换超出了streambuf的职责——streambufs应该接受一个流,并缓冲数据到/从它。而已。像代码转换这样高级别的东西感觉应该属于 iostreams。

由于我无法让模板化的流缓冲区与 unsigned char 一起工作,所以我回到 char,并且只是在 char/unsigned char 之间转换数据。出于显而易见的原因,我试图尽量减少演员表的数量。大多数数据基本上都在 read() 或 write() 函数中结束,然后调用底层的 streambuf。(并在过程中使用强制转换。)读取功能基本上是:

好的解决方案,坏的解决方案?


前两个问题表明需要更多信息。首先,研究了诸如 boost::serialization 之类的项目,但它们存在于更高级别,因为它们定义了自己的二进制格式。这更适用于较低级别的读取/写入,其中希望定义格式,或者格式已经定义,或者不需要或不需要批量元数据。

其次,有些人询问了binary::u32le修饰符。它是一个类的实例化,目前持有所需的字节序和宽度,将来可能是有符号的。该流包含该类的最后传递实例的副本,并在序列化中使用它。这是一种解决方法,我最初尝试过重载 << 运算符:

然而在当时,这似乎并没有奏效。我在模棱两可的函数调用方面遇到了几个问题。对于常量来说尤其如此,尽管您可以,正如一位海报所建议的那样,将其强制转换或仅将其声明为const <type>. 我似乎记得还有其他一些更大的问题。

0 投票
4 回答
14626 浏览

c++ - 从内存缓冲区初始化 C++ std::istringstream?

我有一个内存块(不透明),我想通过他们的 C++ 适配器将它存储在 mySQL 中的 Blob 中。适配器需要一个 istream:

所以我的问题是:如何从这个内存块(类型为 char*)创建一个 std::istream。它不是字符串,因为它不是以空值结尾的(但我当然知道它的长度)。

如果不复制我的内存块,例如在 std::string 中,我找不到一种方法。我觉得这有点浪费。像这样的东西不起作用:

因为 std::streambuf 没有这样的构造函数。我看到了以下建议。

这是正确的方法吗?

0 投票
4 回答
3902 浏览

c++ - 线程安全日志记录

我想实现一个简单的类来从多个线程进行日志记录。这里的想法是,每个想要记录内容的对象都会接收一个 ostream-object,它可以使用通常的运算符向该对象写入消息。所需的行为是,在刷新流时将消息添加到日志中。这样,消息就不会被来自其他线程的消息打断。我想避免使用临时字符串流来存储消息,因为这会使大多数消息至少包含两个行。在我看来,实现这一点的标准方法是实现我自己的流缓冲区,但这似乎非常麻烦且容易出错。有没有更简单的方法来做到这一点?如果没有,您知道关于自定义流缓冲区的好文章/操作方法/指南吗?

提前致谢,

Space_C0wbo0y

更新:

由于它似乎有效,我添加了我自己的答案。

0 投票
2 回答
254 浏览

performance - C++:最好的文本累加器

在发送给客户之前,文本会逐渐累积。

现在我们使用自己的类为每个块分配内存作为大量字符。(无论如何,像char[][]+一样工作std::list<char*>)。

然后我们构建整个字符串,将其转换为 std::sting 然后boost::asio::streambuf使用它创建。我想,这已经够慢了。如我错了请纠正我。

我知道,在许多情况下使用简单FILE类型 from stdio.h。它是如何工作的?在每次写入时分配内存。那么,它更快吗?有什么方法可以读取boost::asio::streambuffromFILE吗?

:嗯。我忘记了一件大事:)。dll和主应用程序的编译是在少数编译器下进行的,所以它里面应该没有stl的东西......因为它通常会在执行dll时引起很多问题。

0 投票
4 回答
2427 浏览

c++ - 派生streambuf 或basic_ostringstream?

我想派生一个字符串流,以便我可以使用 operator<< 构造一条消息,然后将其抛出。API 看起来像:

这应该做一个

所以我所做的是创建一个errorbuf(继承自streambuf),它重载'overflow'方法,然后创建一个ostream(&errorbuf)。我想知道我是否不应该从 basic_ostringstream 或其他东西继承...

0 投票
1 回答
336 浏览

c++ - 如何构建基于 basic_streambuf 的过滤流缓冲区?

我有一个项目需要我在流中插入一个过滤器,以便根据过滤器修改传出数据。经过一番研究,似乎我想做的是像这样创建一个filtered_streambuf:

然后将 afiltered_streambuf<>插入我需要过滤的任何流中。我的问题是我不知道在过滤流时需要维护哪些不变量,以确保

  • 派生类可以按预期工作。特别是,我可能会发现我已经在其他过滤流缓冲区之上构建了过滤流缓冲区。
  • 所有各种流插入器、提取器和操纵器都按预期工作。

问题是我似乎无法弄清楚我需要提供的最小接口是什么,以保证 iostream 将具有正常工作所需的内容。

特别是,我是否需要伪造受保护指针变量的移动?我是否需要一个假数据缓冲区?我可以重写公共函数,根据基本流缓冲区重写它们,还是太简单了?

0 投票
2 回答
42018 浏览

c++ - 使用 Boost Asio 从串口读取

我想检查串行端口上的传入数据包,使用boost.asio. 每个数据包都以一个字节长的标头开始,并指定已发送的消息类型。每种不同类型的消息都有自己的长度。我要编写的函数应该不断地监听新的传入消息,当它找到一个它应该读取它,并调用其他函数来解析它。我目前的代码如下:

boost::asio::streambuf使用正确的工具吗?以及如何从中提取数据以便解析消息?我还想知道我是否需要一个单独的线程来只调用这个函数,以便更频繁地调用它。我是否应该担心由于高流量和串口缓冲区耗尽而在两次调用函数之间丢失数据?我正在使用 Qt 的 GUI 库,但我真的不知道处理所有事件需要多少时间。

编辑:有趣的问题是:如何检查串口是否有任何传入数据?如果没有传入数据,我不希望函数阻塞......