C语言 我应该使用什么类型/函数来跟踪随机访问的文件位置?

brtdzjyr  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(89)

我正在尝试实现一个简化的Boyer-Moore字符串搜索算法,该算法从文件中读取输入文本。该算法要求我从一个给定的文件位置开始,向后读取它的字符,周期性地向前跳跃预先计算的字符数。跳转是根据模式的长度和索引计算的,所以我将它们存储为size_t类型。我应该使用什么函数来读取文件中特定位置的字符,我应该使用什么类型来存储这些位置?我是C的新手,但这些是我考虑过的选择:

Fseek

我可以使用fseekgetc在文件中跳转,但这里使用long int作为其字符索引。我不知道在这个和size_t之间进行强制转换是否安全,不管怎样,GNU C手册出于可移植性的原因建议不要使用fseeking文本流。

Fsetpos

这应该是更可移植的,但我不认为我可以用它来向前或向后跳转任意数量的字符。

二进制流

我可以通过将文件作为二进制流打开来解决fseek兼容性问题。但我不知道这是否会在处理模式/输入文本时导致其他兼容性问题,而且无论如何,这并没有解决long intsize_t之间的转换问题。

文件描述

我可以使用文件描述符而不是流。但是我需要在size_toff_t之间转换,我不知道这有多安全。我也会放弃FILE的缓冲,我不确定这是否可取。我可以尝试滚动自己的缓冲,或者使用备用库,但这似乎是一个巨大的痛苦。
我的第一个实现将输入文本作为命令行参数传递,因此它根本不处理文件IO。但我不认为这会很好地扩展大文本输入,我读到的关于文件IO的文章越多,我就越觉得卡住了。你有什么建议?

xjreopfe

xjreopfe1#

    • size_tlong转换**

如果long对于文件偏移量来说足够大,并且如果size_t值表示文件偏移量,那么在这两者之间转换没有问题。(并且不需要显式强制转换。)

    • 可移植性**

那么,long是否真的足够大,可以作为文件偏移量?众所周知,long是其在Windows上的最小大小,32位。即使是64位程序。因此,如果您计划在使用fseek接口时处理大小为2 GiB或更大的文件,则可能会出现可移植性问题。你应该没有问题的小文件。

    • 向前或向后跳转任意数量的字符**

Windows中使用的CRLF行结束符在这里会咬到你,不管你使用什么界面。
你很有可能解决这个问题。这取决于你对“角色”的定义,也可能取决于跳跃需要有多精确。你没有提供足够的信息让我们帮助你。

相关问题