stream是tbox的最常用的流,一般用于单路io操作,既可以进行阻塞读写,也可以非阻塞的读写。
目前可以支持 数据、文件、套接字、http协议以及各种过滤器的读写操作,也可以很方便的自定义扩展自己的流模块。
之前已经在tbox数据位操作接口的使用一文中,简单介绍了下stream的位读写接口,这里继续详细介绍下stream的常用数据读写接口。
流的常用初始化操作
下面直接上代码吧,基本上看下注释就知道怎么使用了,嘿嘿。。。
继续阅读 »
tbox主要有三种流:
stream: 最常用的流,一般用于单路阻塞、非阻塞io的处理,接口简单易用
async_stream:异步流,基于asio的流,全程回调处理,可以在单个线程里支持多路流的并发,节省系统资源,提高效率
static_stream:静态流,用于对纯buffer的位流处理,一般用于各种解析器
不管是stream还是async_stream,都可以在其上挂接多路filter,实现流之间数据过滤和变换。目前支持以下几种filter:
zip_filter:gzip、zlib的压缩和解压缩过滤器
charset_filter:字符集编码的过滤器
chunked_filter:http chunked编码的解码过滤器
继续阅读 »
tbox中提供了常用的一些stream模块,例如:data、file、http、sock等,可以通过指定不同的url,使用相同的接口
进行数据流的读写,非常的方便。
例如:
```c
// init stream
tb_stream_ref_t stream = tb_stream_init_from_url("http://www.xxx.com/file.txt");
if (stream)
{
// open stream
if (tb_stream_open(stream))
{
// read line
继续阅读 »
参考资料:
Stream Documentation
stream-handbook
Readable, Writable, and Transform Streams in Node.js
继续阅读 »
tbox对于数据文件的解析提供了完善的支持,可以对各种二进制数据,文件数据流,网络数据流等进行各种解析操作
并且提供了一整套字节解析、比特位解析的接口,来支持各种流模式:
stream
通用数据流,提供对流式数据的读写和解析,支持多层流嵌套以及各种协议(http, socket, file, data ...)
对于如何使用stream,这里暂时不详细介绍了,之后会单独重点介绍下,这里主要是为了描述,如何使用stream来处理字节数据的解析
例如,我要从数据流中,读取一个大端的16bits数值,很简单,只要:
c
tb_uint16_t value;
if (tb_stream_bread_u16_be(stream,
继续阅读 »
```
var maxFileSize int64 = 10 * 1000 * 1000 //limit upload file to 10m
if r.ContentLength > maxFileSize {
http.Error(w, "request too large", http.StatusExpectationFailed)
return
}
r.Body = http.MaxBytesReader(w, r.Body, maxFileSize)
继续阅读 »
新特性
自动检测所有系统libc接口,优先使用系统版本
支持自定义内存分配器,并且能够在debug模式下,获取每次分配的代码位置信息,用于自定义追踪
增加轻量级static_pool来维护整块buffer的内存分配,适合局部管理部分内存,pool虽然也能维护,但是底层基于large_pool,比较重量级,适合全局管理内存
增加stream快速读取全部数据到string的接口
增加adler32 hash算法
增加tb_memmem接口
采用pcre/pcre2/posix regex实现正则表达式库
改进
优化stream,支持对字符设备文件的读写
修改tb_init接口,增加allocator自定义内存分配器参数,实现用户的侵
继续阅读 »
1. failed to write data to stream
环境:ipython, OSX
操作:在ipython里import 一个pure module
问题: Python - ERROR - failed to write data to stream: ', mode 'w' at 0x104c8f150>
办法:export PYTHONIOENCODING=UTF-8 will solve it.
相关:stackoverflow
继续阅读 »
这里为了使代码更加简洁,直接用了transfer来挂接两路流的传输操作。
```c
// 初始化文件输入流
tb_stream_ref_t istream = tb_stream_init_from_url("/home/file.txt");
// 初始化文件输出流
tb_stream_ref_t ostream = tb_stream_init_from_file("/home/file.gz", TB_FILE_MODE_RW | TB_FILE_MODE_CREAT | TB_FILE_MODE_BINARY | TB_FILE_MODE_TRUNC);
// 初始化解压缩流,以istream作为输入
继续阅读 »
关键点一: 同一个stringstream对象来多次处理数据,每次使用前,使用stream.str("");保证数据已清空。
例如:
std::stringstream ss;
string result;
ss << 1;
ss>>result;
//必须牢记使用stringstream两次输入,必须使用前清空
ss.clear();
ss.str("");
ss << 2;
又或者参看下面这段程序:
```
include
include
include
using namespace std;
///////////////////////////////////////////////////
继续阅读 »