【发布时间】:2013-10-09 11:49:40
【问题描述】:
对于一个项目,我必须使用 C 风格的文件类型进行读/写。它可以是普通的 FILE,或 gzfile 的 C 版本等。我仍然喜欢使用 C++ 流的便利。是否有一个流类可以在内部重定向到 C 风格的文件操作?所以myfile << hex << myint 最终会变成fprintf("%a", myint) 或类似的东西?
【问题讨论】:
对于一个项目,我必须使用 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 << "Test\n";
fs << std::flush;
fclose(f);
}
注意事项:
stdio_filebuf 不能超出范围,而 iostream 仍在引用它FILE*,stdio_filebuf 在从FILE* 构造时不会这样做
FILE* 之前刷新流,否则stdio_filebuf 的缓冲区中可能有未写入的数据在FILE* 关闭后无法写入。【讨论】:
{} 块。
;-)。
errno 将被设置
您需要的是在 C 文件上写入的 streambuf 类的实现。如果 C++ 标准中还没有一个(这会让我有点失望,但我并不感到惊讶),你可以创建一个并覆盖正确的方法。
请注意,它永远不会将<< 翻译为fprintf(file, ...):结果将更类似于sprintf(buf, ...); fwrite(file, buf)。
【讨论】: