如何在C中有效地完成这类工作?
我能想到的是首先将整个文件加载到内存中然后通过它进行搜索..
但是有更有效的方法吗?
更新
如果文件非常大,则无法将整个文件加载到内存中。
答案 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)