6

对于一个项目,我必须使用 C 风格的文件类型进行读/写。它可以是普通的 FILE,或者是 gzfile 的 C 版本等。我仍然喜欢使用 C++ 流的便利。是否有一个流类可以在内部重定向到 C 风格的文件操作?所以myfile << hex << myint最终变成fprintf("%a", myint)或类似的东西?

4

2 回答 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 回答