我经常注意到,如果有一种方法可以创建“虚拟 FILE
”并为诸如缓冲区之类的事件附加必要的回调,我就可以优雅地解决 C 中的实际问题已满,请求输入,关闭,刷新。然后应该可以使用大部分 stdio.h
函数,例如fprintf
不变。 是否有一个框架可以让人们做到这一点?如果不是,是否可以通过适度的努力至少在某些平台上实现?
可能的应用是:
- 写入或读取动态或静态内存区域。
- 并行写入多个文件。
- 从线程或协同例程中读取生成的数据。
- 将过滤器应用于另一个(虚拟的或真实的)
FILE
。 - 支持间接文件格式(如
#include
)。 - A C 预处理器(?)。
我对特定情况下的解决方案的兴趣不如让您推出自己的 FILE
的框架。我也不是在寻找虚拟文件系统,而是在寻找可以传递给 CRT 的虚拟 FILE*
。
令我失望的是,我从未见过这样的东西;据我所知,C11 认为 FILE
完全取决于语言实现者,如果希望保持语言(+库)规范较小,这可能是合理的,但如果将其与 Java I/进行比较,则令人遗憾O 流。
我确信虚拟 FILE
s 必须可以用于 C 运行时的任何(完全)开源实现,但我想可能有大量细节使其比看起来,如果它已经完成,那么重复工作将是一种耻辱。最好不要修改 CRT 代码。如果没有开源,人们可能能够对所提供的功能进行逆向工程,但我担心结果很容易受到不受支持的功能的更改的影响,除非 promise 提供一组接口(interface)。我也认为任何可以为其编写设备驱动程序的系统都允许创建虚拟设备,但我怀疑这是不必要的低级并且需要编写特权代码。
我必须承认,虽然我的代码可以从虚拟 FILE
中获益,但我目前对它没有任何要求;尽管如此,这是我经常想知道的事情,我想其他人可能会对它感兴趣。
这有点类似于a-reader-interface-that-consumes-files-and-char-in-c , 但提问者并不希望返回一个虚拟的 FILE
;然而,使用 fmemopen
的答案确实如此。
最佳答案
没有用于创建虚拟 FILE* 的标准 C 接口(interface),但 GNU 和 BSD 标准库都包含一个。在 linux (glibc) 上,您可以使用 fopencookie ;在大多数 *BSD 系统上,funopen (包括 Mac OS X )。 (见注1)
这两个界面相似,但在一些细节上略有不同。但是,将为一个界面编写的代码改编为另一个界面通常非常简单。
这些不是完整的虚拟化。他们将 FILE*
与四个回调和一个 void*
上下文(fopencookie
中的“cookie”)相关联。回调是read
、write
、seek
和close
; flush
或 tell
操作没有回调。尽管如此,这对于许多简单的 FILE*
适配器来说已经足够了。
一个简单的例子,参见Write simultaneousely to two streams的两个答案。 .
注意事项:
funopen
源自“功能打开”,而不是“文件未打开”。
关于c - 虚拟化 C 的 FILE* 接口(interface)的可行性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30792052/