Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用`fsetpos()`来";允许对“fseek()”无法处理的文件进行随机访问;_C_C99_Stdio - Fatal编程技术网

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()
d
fpos\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更古老: