我想知道如何在C中读取某个文件,直到读取到某个字符串或字符数组。我希望能够做的是,一旦文件命中该字符串,我希望在该点设置位置。我将使用fseek,这不是问题。这只是读取,直到某个字符串被击中,我无法做到。我一直在阅读一些函数,但似乎没有任何东西可以指导这个。 Fgets是最接近这一点的,但我不想提供一定数量的字符来阅读,因为我不知道有多少。但是,你能给我一些关于如何做到这一点的提示吗?
谢谢!
答案 0 :(得分:1)
有许多有效的字符串搜索算法,每种算法都可以用C实现。
http://en.wikipedia.org/wiki/String_searching_algorithm
如果要查找长度为N的字符串,最简单的方法是保留长度为N的循环缓冲区,并从文件中一次读取1个字节,将其添加到循环缓冲区。在每一步中,您将缓冲区与您要搜索的字符串进行比较。它效率很低,但很容易编码。
答案 1 :(得分:0)
没有内置功能可以完全按照您的要求进行操作,但有一些选项。
选项一:以块的形式读取数据。您不确切知道数据的确切位置,因此请一次读取几kbs的数据,然后在这些块中进行搜索。确保你处理你正在寻找的字符串跨越大块边界的情况!找到字符串后,使用fseek()
将自己定位在字符串的开头。
选项二:内存映射文件并在整个文件上使用memmem()
(映射到内存中)。这需要不可移植的调用来设置内存映射,因此您需要知道您的操作系统(或使用像glib这样的可移植包装器库)。在32位计算机上,它还会将您可以搜索的文件大小限制为几百兆字节。然而,当它是一种选择时,它是一种非常简单有效的方法。
如果选择第一选项,最棘手的部分将是处理大块跨越案例。一种选择是始终在内存中保留两个块,然后重新启动搜索,使其在前一个块结束之前开始(length of target string) - 1
个字节。然后可以使用memmem()
或任何其他string searching algorithm进行实际搜索。您还可以将搜索转换为DFA(因为它是regular language)并保持跨块的当前状态。