【发布时间】:2009-07-24 09:24:12
【问题描述】:
是否可以在 C/C++ 中创建我自己的 FILE (stdio.h) 类型的自定义流,例如可以与 fputs() 一起使用?
【问题讨论】:
-
您使用哪种语言,C 还是 C++?
-
我正在使用需要 FILE* 作为参数的 C++ API。
是否可以在 C/C++ 中创建我自己的 FILE (stdio.h) 类型的自定义流,例如可以与 fputs() 一起使用?
【问题讨论】:
不,不是。 FILE 是所谓的不透明类型 - 它没有任何可以自定义的内容。
【讨论】:
如果您的“自定义流”不是您可以用文件描述符或文件句柄表示的东西,那么您就不走运了。 FILE 类型是实现定义的,因此没有标准方法可以将其他事物与某个事物关联。
如果你可以得到一个 C 文件描述符,无论你试图写入什么,那么你可以调用 fdopen 将其转换为 FILE*。它不是标准的 C 或 C++,而是由 Posix 提供的。在 Windows 上,拼写为 _fdopen。
如果您使用的是 Windows 并且有 HANDLE,那么您可以使用 _open_osfhandle 将文件描述符与其关联,然后从那里使用 _fdopen。
你真的与fputs 绑定了吗?如果不是,则使用 C++ IOStream 替换它。然后,您可以提供自己的 std::basic_streambuf 后代,将其包装在 std::ostream 中,并在其上使用标准 C++ I/O。
【讨论】:
如果您使用 GNU C 库进行编译,您可以使用 fmemopen(3):
fmemopen、open_memstream、open_wmemstream - 将内存作为流打开
【讨论】:
FILE 接口没有标准方法。请注意,C++ 代码通常应该使用 IOStream 进行 IO,配合 IOStream 接口,编写自定义 streambuf 即可解决您的问题。
如果您可以放弃标准一致性,请查看您的实现文档。
POSIX 有一个 popen() 函数,它创建一个从输出读取或写入到进程输入的 FILE*;
POSIX 有一个 fdopen(),它能够从文件描述符创建 FILE*;
至少对于 Linux 使用的 GNU libc,有可能定义自定义 C 流(请参阅信息文档中的“编程 awn 自定义流”部分)。
【讨论】:
这是可能的。但是您应该将您的应用程序与您的 fputs() 版本等链接起来,而不是标准库附带的那些。大多数编译器默认链接到标准 IO 库。你必须想办法解决这个问题。
【讨论】:
fputs() - 有multiple ways of doing it。
这里的每个人都有点错误; (或 2009 年的地点);至少如果您将 glibc 视为伪规范标准库。
查看 GCC 关于自定义流的完整部分:
https://www.gnu.org/software/libc/manual/html_node/Custom-Streams.html
【讨论】: