提问人:Tsvi Benschar 提问时间:6/13/2023 更新时间:6/13/2023 访问量:71
我应该使用哪些类型/函数来跟踪随机访问的文件位置?
What types/functions should I use to track a file position for random access?
问:
我正在尝试实现一种简化的 Boyer-Moore 字符串搜索算法,该算法从文件中读取其输入文本。该算法要求我从给定的文件位置开始,向后读取其字符,定期向前跳转预先计算的字符数。跳转是根据模式的长度和索引计算的,因此我将它们存储为 类型 。我应该使用什么函数来读取特定位置的文件字符,我应该使用什么类型来存储这些位置?我是 C 的新手,但这些是我考虑过的选项:size_t
Fseek
我可以使用 和 在文件中跳转,但这使用 a 作为其字符索引。我不知道在 this 和 a 之间转换是否安全,无论如何,出于可移植性的原因,GNU C 手册建议不要搜索文本流。fseek
getc
long int
size_t
Fsetpos
这应该更便携,但我认为我不能用它来向前或向后跳转任意数量的字符。
二进制流
我可以通过将文件作为二进制流打开来解决兼容性问题。但我不知道这是否会导致在处理模式/输入文本时出现其他兼容性问题,无论如何,这并不能解决 和 之间的强制转换问题。fseek
long int
size_t
文件描述符
我可以使用文件描述符而不是流。但是我需要在 和 之间转换,我不知道这有多安全。我也会放弃 的缓冲,我不确定这是否可取。我可以尝试滚动自己的缓冲,或者使用备用库,但这似乎是一个巨大的痛苦。size_t
off_t
FILE
我的第一个实现将输入文本作为命令行参数传递,因此它根本不处理文件 IO。但我认为这不适用于大型文本输入,而且我阅读的有关文件 IO 的信息越多,我就越觉得卡住了。你有什么建议?
答:
size_t
⇔长
转换
如果对于文件偏移量足够大,并且您的值表示文件偏移量,则在这两者之间进行转换没有问题。(而且不需要明确的演员阵容。long
size_t
可移植性
那么实际上是否足够大,可以进行文件偏移呢? 众所周知,它在 Windows 上的最小大小为 32 位。即使在 64 位程序中。因此,如果您计划在使用接口时处理大小为 2 GiB 或更大的文件,则可能会出现可移植性问题。较小的文件应该没有问题。long
long
fseek
向前或向后跳转任意数量的字符
无论您使用什么界面,Windows 中使用的 CRLF 行尾都会在这里咬您。
您很可能可以解决此问题。这取决于你对“性格”的定义,也可能取决于跳跃需要的精确程度。您没有提供足够的信息让我们为您提供帮助。
评论
long
fseek
fseek
long
lseek
off_t
SetFilePointer
评论
mmap()
LONG_MAX
fseek
SEEK_CUR