在c++中存储指向磁盘上文件行号的指针
storing pointers to line numbers of a file stored on disk in C++
我想在数组中存储指向文件行号的指针,然后我想从磁盘中检索指定的行。我不能直接存储行号的指针,因为当我读取文件时,内存位置会发生变化。因此,我将存储从文件开头开始的偏移量。为了存储偏移量,我使用"uint_64t"。然而,由于我的文件大小是200GB,因此"uint_64t"不能表示所有的偏移量。
我有以下问题:
-
除了存储偏移量之外,是否有其他方法可以存储存储在磁盘上的文件指针
-
是否有一些其他的数据结构,我可以使用(除了uint64_t)。
在POSIX系统上,off_t
是文件偏移量的标准类型。但是,它可能是64位类型,就像uint64_t
一样,因为它们可以毫无问题地保存2e11的值。
你错了。uint64_t
是64位的,所以你可以用它来表示2^64 bytes = 18.45 exabytes
文件中的偏移量。根据Wolfram Alpha,您可以将其与以下内容进行比较:
- 估计人类所有知识的信息含量(截至1999年中期)(~ 12 EB)
- 180 ×《星际迷航:下一代》中角色数据的存储容量(8×10^ 17b)
你的文件不可能那么大。:)
64位无符号整数应该足够大,可以将字节偏移量存储到一个200gb的文件中。
200 GB = 200 GB * 1024 MB/GB * 1024 KB/MB * 1024 Bytes/KB = 214,748,364,800 Bytes
但是,64位整数有一个范围:
Low: 0, High: 18,446,744,073,709,551,615
我不觉得有什么问题。您可以很容易地索引到该文件的每个字节。事实上,您可以索引文件的每个部分,并且仍然有很大的增长空间!
您可以遵循一些编码方案来存储偏移值。
的例子:文件偏移量值应除以2或4,并保存在uint64_t变量中。因此,数值范围应合理缩小。
在读取数据时,将uint64_t变量值乘以2或4(前面使用过),并获得确切的偏移值。
相关文章:
- 为什么当我尝试将char输入到int时,文件指针会卡住
- fprintf 不打印到文件,当文件指针在其他地方声明时
- 如何从NTFS中的$ MFT文件访问文件的每个块的文件指针
- 尽管文件指针正确,但在fclose()期间的segfault
- 当调用FREAD()函数时,文件指针如何移动
- C++如何复制文件 * 指针
- 如何将文件描述符 (int fd) 转换为文件指针 ( 文件* fp )
- Visual Studio 2010 调用 _locking() 失败 (errno = 22) 当文件指针高于 (2^
- 如何在 c++ 中查找文件指针位置
- c++文件指针工作不正常
- 做一个popen(),将文件*指针放入fstream中,pclose()呢?
- 在Linux中,多个进程使用文件指针读取文件时使用的共享虚拟内存
- 无法声明文件指针数组
- 将文件指针重定向到C/C++中的字符串
- 如何检查文件指针/描述符/句柄是否关联到同一个文件/管道/终端
- 在记录中定位文件指针
- 流和文件指针移动
- 如何将文件指针移回一个整数
- C++ 如何使用文件指针以增量方式写入文件
- 为什么std::istream::read不根据读取的字节移动文件指针