将 C 样式文件包装在流C++
Wrap C-style files in C++ stream
对于一个项目,我必须使用C风格的文件类型读/写。它可以是常规的FILE,也可以是gzfile的C版本等。我仍然希望使用C++流的便利性。是否有在内部重定向到 C 样式文件操作的流类?那么myfile << hex << myint
最终会变成fprintf("%a", myint)
或类似的东西?
没有标准的,但如果你必须这样做,那么你将不得不使用非标准的东西。
GCC 的标准库包括一个 streambuf 类型,__gnu_cxx::stdio_filebuf
,可以用FILE*
(或文件描述符(构造,您可以使用它来替换fstream
的 streambuf,或者只是与普通iostream
一起使用,例如
#include <stdio.h>
#include <ext/stdio_filebuf.h>
#include <fstream>
int main()
{
FILE* f = fopen("test.out", "a+");
if (!f)
{
perror("fopen");
return 1;
}
__gnu_cxx::stdio_filebuf<char> fbuf(f, std::ios::in|std::ios::out|std::ios::app);
std::iostream fs(&fbuf);
fs << "Testn";
fs << std::flush;
fclose(f);
}
关于这一点需要注意的事项:
stdio_filebuf
不得超出范围,而iostream
仍在提及它- 您需要手动关闭
FILE*
,当从FILE*
构造时,stdio_filebuf
不会这样做 - 一定要在关闭
FILE*
之前刷新流,否则stdio_filebuf
的缓冲区中可能有未写入的数据在FILE*
关闭后无法写出。
你需要
的是在 C 文件上写入的 streambuf
类的实现。如果C++标准中还没有一个(这会让我有点失望,但不会让我感到惊讶(,你可以创建一个并覆盖正确的方法。
请注意,它永远不会将<<
转换为fprintf(file, ...)
:结果将更类似于sprintf(buf, ...); fwrite(file, buf)
。
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 创建包装升压适配器的自定义范围类
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用运算符*重载包装矩阵乘法