【问题标题】:Is it possible to create a C FILE object to read/write in memory是否可以创建一个 C 文件对象以在内存中读/写
【发布时间】:2013-05-24 19:48:31
【问题描述】:

我正在使用一个接受 FILE * 的 API,并使用它在内存中创建数据缓冲区:

std::shared_ptr<FILE> f(tmpfile(), fclose);
write_to_file(f.get());
rewind(f.get());
auto data = make_file_buffer(f.get());
return data;

这可行,但比写入内存缓冲区慢。

是否可以让它写入内存文件并避免读取/写入磁盘(如 stdin/stdout/stderr 读取/写入控制台)?

注意:我使用的是 Linux,因此可以访问 Linux 和 POSIX API。

【问题讨论】:

  • 在Linux上可以打开/dev/shm中的文件,该文件纯粹存在于内存中。
  • 这不是 C,您使用的是 C++ 结构。
  • @wildplasser 我正在使用的 API -- FILE *tmpfilefcloserewind(以及 fputcfwrite 等在 @987654329 中的调用@) -- 是在stdio.h 中定义的 C API。这就是为什么我将它标记为C,因为我在一个将FILE * 返回到内存缓冲区的C 函数之后。我使用 C++ 构造来展示我是如何使用 C API 的。

标签: c++ file memory


【解决方案1】:

是的,这是可能的,请参阅fmemopen

【讨论】:

  • 我从来不知道这件事。 +1 :)。
  • @slugonamission 哈哈,我也没有。这听起来像是一件有用的事情。 +1。
  • 还有来自该链接的open_memstream 为您分配缓冲区并为您提供其位置和大小。感谢您的回答。
  • 如何在 Windows 上做到这一点?
  • @AryaPourtabatabaie:Windows,或者更确切地说是 MSVCRT,本身并不支持这一点。您可能可以通过打开带有“临时”提示的文件(除非您用完物理内存,它几乎等同于内存文件)或通过创建匿名文件映射(这也是一个一种“内存缓冲区”),然后在HANDLE 上调用_open_osfhandle(),然后调用_fdopen()。这会给你一个FILE*
【解决方案2】:

我在上面写了一条评论,但我会充实它以获得答案。

由于您的 API 需要 FILE 句柄,因此最简单的方法是在内存文件系统上创建文件,例如在 Linux 上使用 ramfs 或 tmpfs 挂载的文件。

在大多数 Linux 系统上,默认情况下会在 /dev/shm 下创建其中一个,因此在 /dev/shm 下创建的任何文件仍将作为实际文件存在,但只会存在于内存中。当然,如果重新启动,文件的内容将会丢失。我也不认为它可以分页到磁盘,所以尽量避免写入大文件,否则你会占用内存中的所有空间。

【讨论】:

  • @Dariusz - 我现在意识到了这一点,因此在上面评论了 Damon 的回答。
  • 这将如何在 Windows 上运行?它不支持fmemopen 也不支持open_memstream
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多