我正在尝试实现一个简化的Boyer-Moore字符串搜索算法,该算法从文件中读取输入文本。该算法要求我从一个给定的文件位置开始,向后读取它的字符,周期性地向前跳跃预先计算的字符数。跳转是根据模式的长度和索引计算的,所以我将它们存储为size_t
类型。我应该使用什么函数来读取文件中特定位置的字符,我应该使用什么类型来存储这些位置?我是C的新手,但这些是我考虑过的选择:
Fseek
我可以使用fseek
和getc
在文件中跳转,但这里使用long int
作为其字符索引。我不知道在这个和size_t
之间进行强制转换是否安全,不管怎样,GNU C手册出于可移植性的原因建议不要使用fseeking文本流。
Fsetpos
这应该是更可移植的,但我不认为我可以用它来向前或向后跳转任意数量的字符。
二进制流
我可以通过将文件作为二进制流打开来解决fseek
兼容性问题。但我不知道这是否会在处理模式/输入文本时导致其他兼容性问题,而且无论如何,这并没有解决long int
和size_t
之间的转换问题。
文件描述
我可以使用文件描述符而不是流。但是我需要在size_t
和off_t
之间转换,我不知道这有多安全。我也会放弃FILE
的缓冲,我不确定这是否可取。我可以尝试滚动自己的缓冲,或者使用备用库,但这似乎是一个巨大的痛苦。
我的第一个实现将输入文本作为命令行参数传递,因此它根本不处理文件IO。但我不认为这会很好地扩展大文本输入,我读到的关于文件IO的文章越多,我就越觉得卡住了。你有什么建议?
1条答案
按热度按时间xjreopfe1#
size_t
long
转换**如果
long
对于文件偏移量来说足够大,并且如果size_t
值表示文件偏移量,那么在这两者之间转换没有问题。(并且不需要显式强制转换。)那么,
long
是否真的足够大,可以作为文件偏移量?众所周知,long
是其在Windows上的最小大小,32位。即使是64位程序。因此,如果您计划在使用fseek
接口时处理大小为2 GiB或更大的文件,则可能会出现可移植性问题。你应该没有问题的小文件。Windows中使用的CRLF行结束符在这里会咬到你,不管你使用什么界面。
你很有可能解决这个问题。这取决于你对“角色”的定义,也可能取决于跳跃需要有多精确。你没有提供足够的信息让我们帮助你。