对于一个项目,我必须使用 C 风格的文件类型进行读/写。它可以是普通的 FILE,或者是 gzfile 的 C 版本等。我仍然喜欢使用 C++ 流的便利。是否有一个流类可以在内部重定向到 C 风格的文件操作?所以myfile << hex << myint
最终变成fprintf("%a", myint)
或类似的东西?
问问题
1615 次
2 回答
3
没有标准的,但如果你必须这样做,那么你将不得不使用非标准的东西。
GCC 的标准库包含一个 streambuf 类型,__gnu_cxx::stdio_filebuf
它可以用 a FILE*
(或文件描述符)构造,您可以使用它来替换 a 的 streambuf fstream
,或者只使用普通的,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
从 a 构造时不会这样做FILE*
- 确保在关闭 之前刷新流
FILE*
,否则可能有未写入的数据位于stdio_filebuf
的缓冲区中,在关闭后无法写出FILE*
。
于 2013-10-09T12:16:46.920 回答
1
您需要的是streambuf
在 C 文件上写入的类的实现。如果 C++ 标准中还没有一个(这会让我有点失望,但并不让我感到惊讶),你可以制作一个并覆盖正确的方法。
请注意,它永远不会翻译<<
为fprintf(file, ...)
:结果将更类似于sprintf(buf, ...); fwrite(file, buf)
.
于 2013-10-09T12:03:28.163 回答