C 如何使用`fsetpos()`来";允许对“fseek()”无法处理的文件进行随机访问;
据我所知,C 如何使用`fsetpos()`来";允许对“fseek()”无法处理的文件进行随机访问;,c,c99,stdio,C,C99,Stdio,据我所知,fpos\u t是一种不透明类型,拟由fgetpos()函数进行初始化,其中第7.19.9.1条规定: C89中添加了fgetpos和fsetpos,以允许对太大而无法使用fseek和ftell处理的文件进行随机访问操作 和§7.19.9.2: 需要以long值对记录位置和记录内的位置进行编码,这可能会限制文本文件的大小,而fseek和ftell可用于此文件的文本文件的大小大大小于二进制文件的大小 添加了fgetpos和fsetpos以处理太大而无法处理的文件fseek和ftell
fpos\u t
是一种不透明类型,拟由fgetpos()
函数进行初始化,其中第7.19.9.1条规定:
C89中添加了fgetpos
和fsetpos
,以允许对太大而无法使用fseek
和ftell
处理的文件进行随机访问操作
和§7.19.9.2:
需要以long
值对记录位置和记录内的位置进行编码,这可能会限制文本文件的大小,而fseek
和ftell
可用于此文件的文本文件的大小大大小于二进制文件的大小
添加了fgetpos
和fsetpos
以处理太大而无法处理的文件fseek
和ftell
这似乎主要集中在文本文件上(使用模式打开的文件不包括b
标志),因为某些实现可能需要存储两个位置(文件记录位置和记录字符位置),这可能会显著减少fseek()
和ftell()的有效范围
用于文本流的函数
然而,我不知道这对于文本流是如何特别有用的,我当然不明白它如何能够有效地用于“随机访问”
似乎真正利用这些函数的唯一方法是读取文件的每个字符,并缓存它们的fgetpos()
dfpos\u t
值,这似乎是最合适的,因为您几乎肯定不想读取任何接近LONG\u MAX
字符的内容
“委员会”是怎么想的?是否存在C99基本原理?我认为在某些(可能是古代主机)系统上,文本文件存储为一系列“记录”(行),因此文件位置由记录索引和记录中的位置组成,这就是基本原理文本所指的位置。在操作系统级别,seek操作需要记录索引和记录中的位置,而不是文件中的字节位置;这导致了这样一个问题,即内的记录索引和位置必须在long
值中编码,以便与fseek
和ftell
一起使用。因此,库实现需要为每个记录索引和位置分配一定数量的位,这限制了记录的数量和位置
例如,如果long
有32位,则可能会将其分为25位用于记录索引,7位用于记录内的位置(允许最大可用记录长度为127,2^25~=33k记录)。但是,系统可能允许更多和更大的记录
(上述陈述部分是模糊的回忆,部分是从基本原理文本中推断出来的)
然而,即使在现代桌面系统上,fseek
和ftell
的真正问题是,long
值可能不足以表示文件位置的全部范围。在32位系统上,long
通常为32位,但文件通常仍会增长到2GB以上。因此,需要一种不同的机制来指定文件偏移量
我当然不明白它如何能有效地用于“随机访问”
在这种情况下,通过“随机访问”,他们所说的是寻找已经访问过的任何点的能力,也就是说,您可以重新定位(使用fsetpos
)您已经获得的任何位置(通过fgetpos
)。它不是寻找任意字节位置。可以说,“随机访问”是一个错误的术语,但我认为他们只是想区别于纯粹的顺序访问。+1但IBM大型机并不比ASCII或POSIX更古老: