虽然我知道fpos_t是一种不透明类型,打算通过fgetpos()函数进行初始化,但C99 rationale的§7.19.9.1指出:



以及第7.19.9.2节:



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

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

似乎真正利用这些功能的唯一方法是读取文件的每个字符并缓存其fgetpos()fpos_t值,这似乎是一种利基,因为您几乎肯定不想在LONG_MAX字符附近读取任何内容。

“委员会”的想法是什么?有C99基本原理吗?

最佳答案

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

例如,如果long具有32位,则可以将其划分为记录索引的25位和记录中位置的7位(允许最大可用记录长度为127,并且2 ^ 25〜= 33k个记录)。但是,系统可能会允许更多和更大的记录。

(以上陈述部分是模糊的记忆,部分是根据基本原理的推论)。

但是,即使在现代台式机系统上,fseekftell的真正问题是long值可能不足以代表整个文件位置范围。在32位系统上,long通常为32位,但是文件通常仍可以增长到大于2GB。因此,需要不同的机制来指定文件偏移量。



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

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

10-11 18:45