在C++中打开的带有"fopen"的mmap文件
mmap file opened with "fopen" in C++
在许多计算机中对HDF5的支持有限之后,我决定编写自己的数据容器来将数组存储在二进制文件中。
基本上,格式非常简单:每个变量都有一个小标题,包括变量名称、维度数、每个维度的实际大小和变量类型。一个变量的数据存储在标头之后。变量一个接一个地存储。
头文件的读/写操作使用 fseek、read、fwrite 方便地完成,因此我使用 fopen 打开了文件,它返回一个 FILE*。
问题是,如果我想更新磁盘上一个数组的部分值,最干净的方法是使用内存映射(在我看来(。查看 mmap 的文档,可以使用 "open" 打开的 mmap 文件,它返回一个 int。但是我的文件已经用"fopen"打开了。
是否可以映射文件*的一部分?如何?
您正在寻找的是fileno
函数:
int fileno(FILE *stream(;
函数 fileno(( 检查参数流并返回其整数文件描述符。
您可以在文件流上调用它并将结果传递给mmap
。要么这样做,要么只是使用open
而不是fopen
首先获取文件描述符,因为通过内存映射解析标头可能比使用fseek
和fread
更容易。
相关文章:
- 试图创建流或fopen时程序崩溃
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- fopen 在 gdb 中返回 NULL
- fopen 在创建大量文件后因 EFBIG "File too large" 而失败
- fopen 与常量字符 * 从 QString 是不可能的
- 在C++中打开的带有"fopen"的mmap文件
- 无法使用 fopen() 加载文件
- 在我可以从fopen打开文件时,CopyFile无法找到该文件
- 使用 fopen() 的最佳方法是什么
- 使用MMAP与FSTREAM或FOPEN访问二进制文件
- 使用 fopen 而不是 Visual Studio 建议的 fopen_s 有什么错误
- 'fopen'返回格式错误的'fp'
- fopen 和 fwrite 从多个线程到同一个文件
- fopen 几分钟后无法打开文件
- 对"fopen"的期望
- header for fopen visual studio 2015 community edition
- 在UWP中获取fopen()的应用程序路径
- 为什么Fopen在Nexus5X Android设备(C )上失败
- 我如何确保Fopen()相对于可执行的目录打开一个文件,而不是我当前的目录
- 在地铁应用程序中使用fopen打开文件