【问题标题】:custom FILE type in C/C++C/C++ 中的自定义文件类型
【发布时间】:2009-07-24 09:24:12
【问题描述】:

是否可以在 C/C++ 中创建我自己的 FILE (stdio.h) 类型的自定义流,例如可以与 fputs() 一起使用?

【问题讨论】:

标签: c++ c


【解决方案1】:

不,不是。 FILE 是所谓的不透明类型 - 它没有任何可以自定义的内容。

【讨论】:

  • 那么windows怎么能处理磁盘上的文件、网络上的文件、虚拟文件……?某些方面必须是可定制的。
  • 然后命名一个。 FILE 类型没有可供应用程序程序员使用的成员。
  • @xtofl:因为 Windows 上的 FILE* 映射到 CreateFile 返回的 HANDLE。 FILE* 不做“定制”
【解决方案2】:

如果您的“自定义流”不是您可以用文件描述符或文件句柄表示的东西,那么您就不走运了。 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。

【讨论】:

  • 非常感谢,这行得通:CreatePipe() + _open_osfhandle() + fdopen()
【解决方案3】:

如果您使用 GNU C 库进行编译,您可以使用 fmemopen(3):

fmemopen、open_memstream、open_wmemstream - 将内存作为流打开

【讨论】:

    【解决方案4】:

    FILE 接口没有标准方法。请注意,C++ 代码通常应该使用 IOStream 进行 IO,配合 IOStream 接口,编写自定义 streambuf 即可解决您的问题。

    如果您可以放弃标准一致性,请查看您的实现文档。

    • POSIX 有一个 popen() 函数,它创建一个从输出读取或写入到进程输入的 FILE*;

    • POSIX 有一个 fdopen(),它能够从文件描述符创建 FILE*;

    • 至少对于 Linux 使用的 GNU libc,有可能定义自定义 C 流(请参阅信息文档中的“编程 awn 自定义流”部分)。

    【讨论】:

    • popen(0 如何解决问题?
    • 我们对这个问题了解得不够多,无法确定。我们只知道他必须将 FILE* 传递给 API。将其程序组织在两个或多个进程中可能是一种解决方案(例如,生成一个执行 popen() 的进程,然后使用结果调用 API)。
    • 我明白了,谢谢你的建议,但我不能这样做。我使用的 API 也有一个上下文作为参数,应用此解决方案可能非常困难。
    • @AProgrammer。在这种情况下,popen() 是 SO 上发布的几乎所有问题的可能答案 - 我觉得不是很有用。
    • @Neil,您在我对 popen() 的建议中阅读的内容超出了我的预期。它旨在成为可用的系统特定内容的示例。我把它放在 GNU libc 自定义流之前只是因为 POSIX 更标准。我重新表述了该条目,希望更清晰,并添加 fdopen() 使其更完整。
    【解决方案5】:

    这是可能的。但是您应该将您的应用程序与您的 fputs() 版本等链接起来,而不是标准库附带的那些。大多数编译器默认链接到标准 IO 库。你必须想办法解决这个问题。

    【讨论】:

    • 他不想重写 fputs(),他想专门化 FILE。或者至少这是我的阅读。
    • 如果我定义了自己的 fputs(),任何对 fputs() 的调用都会通过我的 fputs。
    • @FranckFreiburger 一点也不。您可以遵从您覆盖的fputs() - 有multiple ways of doing it
    【解决方案6】:

    这里的每个人都有点错误; (或 2009 年的地点);至少如果您将 glibc 视为伪规范标准库。

    查看 GCC 关于自定义流的完整部分:

    https://www.gnu.org/software/libc/manual/html_node/Custom-Streams.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多