给定FILE *,如何有效地找到第一次出现的“abc”的偏移量?

时间:2011-09-10 00:21:36

标签: c file-io

如何在C中有效地完成这类工作?

我能想到的是首先将整个文件加载到内存中然后通过它进行搜索..

但是有更有效的方法吗?

更新

如果文件非常大,则无法将整个文件加载到内存中。

4 个答案:

答案 0 :(得分:2)

您可以逐块读取文件并在每个块中搜索“abc”。有像Boyer-Moore搜索这样的算法可以减少你必须明确检查的字符数。

在Linux中,您可以使用posix_fadvise告诉它您将啜饮该文件。

答案 1 :(得分:2)

将整个文件加载到内存中是不必要且效率低下的。尝试这样的事情:

FILE *fl;
int cc = getc(fl);
while (cc != EOF)
{
   if (cc=='a')
   {
     cc = getc(fl);
     if (cc=='b')
     {
       cc = getc(fl);
       if (cc=='c')
          return "FOUND";
      }
    }
    cc = getc(fl);
  }
  return "NOT FOUND";

显然你永远不会真正使用这样的代码。你应该编写一个需要搜索任意字符串的函数,但算法基本相同。此外,I / O将由系统缓冲,因此您不必担心一次读取单个字符的效率。此外,我没有包含任何错误检查。

答案 2 :(得分:0)

对于字符串搜索,有许多有趣的算法。例如,在Boyer-Moore你可以利用第三个位置必须是'c'的事实,如果要匹配'abc',如果它'c'那么表格就会说多远进展(例如,如果它''你可以跳过前3,因为前3个字母根本不能引起你的兴趣)。

然而,有趣的字符串搜索方法与阅读文件所花费的时间完全无关。如果你想处理任意文件,你应该避免全部阅读,因为额外的内存使用是浪费的,并会减慢你的速度。但是你无法避免阅读整个文件,直到找到你的字符串。

答案 3 :(得分:0)

您使用的操作系统是什么?如果是Linux,您可以使用memory map自动将特定部分内存直接映射到文件。它的速度要快得多。

修改

mmap不会立即将整个文件加载到内存中。它效率更高。