图片来源:《灵笼》特别篇截图 方案一:继承 std::streambuf 详细解释查看 《C++标准库:第2版》 15.13章节 输出流(没有缓冲区) 在不考虑缓冲区的情况下,继承 std::streambuf 并重写两个函数 : 输出流(有缓冲区) 考虑缓冲区的话,需要: 输入流 输入流需要考虑支持回退(basic_istream& unget()),重写 virtual int_type underflow () 函数用以从文件描述符中读取数据到缓冲区,缓冲区前 4 字节保存可回退数据 方案二:使用 __gnu_cxx::stdio_filebuf stdio_filebuf 支持使用文件描述符或者C文件指针(std::__c_file * 即 FILE *)构造,部分构造函数: 使用示例: 注意:对于文件描述符,stdio_filebuf 在析构时会主动调用 close ;但对于 FILE * 则不会主动关闭,需要手动调用 fclose 方案三:使用 boost::iostreams::file_descriptor_source 和 boost::iostreams::file_descriptor_sink boost 的 file_descriptor_source 和 file_descriptor_sink 可以使用文件描述符来构造,继而构造出 boost::iostreams::stream ,部分构造函数: 其中 file_descriptor_source 只能从文件描述符读取数据,file_descriptor_sink 则只能写入数据,file_descriptor_flags 用以控制析构时是否自动关闭文件描述符 参考: 《C++标准库:第2版》 __gnu_cxx::stdio_filebuf< _CharT, _Traits >(3) —— man page File Descriptors —— boost
Daily Archives: April 8, 2023
1 post