在C++中打开的带有"fopen"的mmap文件

mmap file opened with "fopen" in C++

本文关键字:C++ fopen mmap 文件      更新时间:2023-10-16

在许多计算机中对HDF5的支持有限之后,我决定编写自己的数据容器来将数组存储在二进制文件中。

基本上,格式非常简单:每个变量都有一个小标题,包括变量名称、维度数、每个维度的实际大小和变量类型。一个变量的数据存储在标头之后。变量一个接一个地存储。

头文件的读/写操作使用 fseek、read、fwrite 方便地完成,因此我使用 fopen 打开了文件,它返回一个 FILE*。

问题是,如果我想更新磁盘上一个数组的部分值,最干净的方法是使用内存映射(在我看来(。查看 mmap 的文档,可以使用 "open" 打开的 mmap 文件,它返回一个 int。但是我的文件已经用"fopen"打开了。

是否可以映射文件*的一部分?如何?

您正在寻找的是fileno函数:

int fileno(FILE *stream(;

函数 fileno(( 检查参数流并返回其整数文件描述符。

您可以在文件流上调用它并将结果传递给mmap。要么这样做,要么只是使用open而不是fopen首先获取文件描述符,因为通过内存映射解析标头可能比使用fseekfread更容易。