在 C 标准库中使用内存流的目的是啥?

Posted

技术标签:

【中文标题】在 C 标准库中使用内存流的目的是啥?【英文标题】:What is the purpose of using memory stream in the C standard library?在 C 标准库中使用内存流的目的是什么? 【发布时间】:2018-10-14 16:25:12 【问题描述】:

在 C 标准库中,使用内存流(通过fmemopen() 为数组创建)的目的是什么?与直接操作数组相比如何?

【问题讨论】:

假设您有一个以FILE* 作为参数的函数,并且您希望它写入的输出但在内存缓冲区中而不是写入磁盘上的文件。您可以打开一个文件并让函数写入它,然后将文件的内容读入内存。但是,如果您可以从内存缓冲区创建FILE*,那不是更简单吗? 哦,注意fmemopen 不是标准的 C 函数,而是 POSIX 标准的一部分。 我现在找不到该文档,但是有一份书面提案要求在 POSIX 2008 中包含此功能和其他功能,解释了动机(至少委员会似乎一直在说服)很好。一个好的答案应该引用它。 @Someprogrammerdude 谢谢。我询问了使用内存流和直接操作内存中的数组之间的比较。我没有提到使用文件。 那么没有真的没有区别。为什么使用fmemopen 和例如fprintf 而不是直接的snprintf(例如)?不同之处在于处理处理FILE* 的函数。 fmemopen 的重点是让通用接口更容易用于写入或读取通用目标/源,无论是内存还是文件。 【参考方案1】:

这与在 C++ 中使用 std::stringstream 非常相似,它允许您写入字符串(包括 '\0' 字符),然后使用您想要的字符串。

我们的想法是我们可以使用许多函数,例如fprintf(),可用于以格式化的方式将数据写入流。所有这些功能都可以与基于内存的文件一起使用,无需在fopen()fmemopen() 之外的任何地方进行进一步更改。

所以如果你想创建一个需要多个fprintf() 的字符串,使用该函数在内存中生成字符串是非常有用的。如果您只需要一次快速 转换,也可以使用snprintf()

同样,你当然可以使用fread()fwrite()等。如果您需要创建一个需要大量查找的文件,并且它不是那么大以至于可以轻松放入内存中,那么它的速度会快很多。完成后,您可以将结果保存到磁盘。

【讨论】:

以上是关于在 C 标准库中使用内存流的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

标准模板库中的向量(vector)

string.h是啥头文件

c/c++标准库中的文件操作总结

C标准库中的函数定义在哪里?

是否有符合标准的方法来检测 C 标准库中的函数是否通过内部/内置实现?

C 标准库中的头文件可以包含另一个头文件吗?