gpt4 book ai didi

c - `fsetpos()`如何用于 "allow random access on files that are too large to handle with ` fseek( )`?"

转载 作者:太空狗 更新时间:2023-10-29 17:26:22 25 4
gpt4 key购买 nike

虽然我知道 fpos_t 是一种不透明类型,旨在由 fgetpos() 函数初始化,C99 rationale 的 §7.19.9.1|指出:

fgetpos and fsetpos were added to C89 to allow random access operations on files that are too large to handle with fseek and ftell.

和§7.19.9.2:

The need to encode both record position and position within a record in a long value may constrain the size of text files upon which fseek and ftell can be used to be considerably smaller than the size of binary files.

...

fgetpos and fsetpos were added to deal with files that are too large to handle with fseek and ftell.

这似乎主要关注文本文件(使用 mode 打开的文件,不包括 b 标志),因为某些实现可能需要存储两个位置(一个文件记录位置和记录字符位置),这会显着减少文本流的 fseek()ftell() 函数的有效范围。

不过,我对这对文本流有何特别有用一无所知,而且我当然不明白它如何有效地用于“随机访问”。

实际使用这些函数的唯一方法似乎是读取文件的每个字符并缓存它们的 fgetpos()d fpos_t 值,这似乎充其量是小众的,因为您几乎肯定不想阅读 LONG_MAX 个字符附近的任何地方。

“委员会”在想什么?有没有C99 rationale 的理由?

最佳答案

我相信在某些(可能是 archaic 大型机)系统上,文本文件存储为一系列“记录”(行),因此文件位置由记录索引和内部位置组成记录,这就是基本原理文本似乎指的是什么。在操作系统级别,查找操作需要记录索引和记录中的位置,而不是文件中的字节位置;这导致了一个问题,即记录索引和位置都必须在 long 值中编码,以便与 fseekftell 一起使用。因此,库实现需要为每个记录索引和位置分配一些位数,这限制了记录的数量和位置。

例如,如果 long 有 32 位,那么它可能被分成 25 位用于记录索引和 7 位用于记录中的位置(允许最大可用记录长度为 127,和 2^25 ~= 33k 条记录)。然而,系统可能允许比这更多更大的记录。

(以上说法一部分是模糊的记忆,一部分是从理据文中推断的)。

然而,即使在现代桌面系统上,fseekftell 的真正问题在于 long 值可能不足以表示全方位的文件位置。在 32 位系统上,long 通常是 32 位,但文件通常仍然可以增长到大于 2GB。因此需要一种不同的机制来指定文件偏移量。

I certainly don't understand how it could effectively be used for "random access."

在这种情况下,通过“随机访问”,他们所说的是能够寻找到任何已经访问过的点的能力,也就是说,您可以重新定位(使用fsetpos)任何已经访问过的位置你已经获得了(通过fgetpos)。它与寻找任意字节位置无关。可以说“随机访问”是错误的术语,但我认为他们只是想与纯粹的顺序访问区分开来。

关于c - `fsetpos()`如何用于 "allow random access on files that are too large to handle with ` fseek( )`?",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36331101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com