2013-05-28 59 views
0

程序适用于.wave文件。如何比较字符串“部分”(以返回匹配的字符数)?

下面的代码是查找“数据”子块的程序的一部分。它写出所有必要的数据块到输出文件,然后找到"data"(copyes接下来的4个字节为char comp_dataID[4];,并与const char dataID[4] = "data";比较):

while(1) /* finding "data"*/ { 
    fread(comp_dataID, 4, 1, input); 

    if (memcmp(comp_dataID, dataID, 4) == 0) { 
     printf(">>> \"data\" found!\n"); 
     fwrite(&comp_dataID, 1, 4, output); 
     break; 
    } 
    else { 
     fseek(input, -3, SEEK_CUR); 
    } 
} 

可以有很多extentional子块前的“数据”,所以我想优化程序:

  1. 如果接下来的4个字节包含“....”,则复制下4个字节。 (跳过3次不必要的操作)
  2. 如果“... d”,则fseek(input, -1, SEEK_CUR);/*在“d”* /之前设置pionter,然后复制下4个字节。
  3. 如果“..da”然后fseek(input, -2, SEEK_CUR);/*在“d”* /之前设置pionter,然后复制接下来的4个字节。
  4. 如果“.dat”然后fseek(input, -3, SEEK_CUR);/*在“d”* /之前设置pionter,然后复制接下来的4个字节。

问题是我不明白如何比较“... d”和“数据”。即如何找出char comp_dataID[4]; containd“... d”或“..da”或“.dat”。


问题:有没有做这个(返回相匹配的字符数的任何功能:在以下情况下0的情况下“......‘1’... d”等等。)?

......或者我会用for()周期ti找到“d”,然后找到“a”,然后找到“t”。根据rezults,在“d”之前设置pionter以复制下一个4字节(“数据”)。

PS 此CHAR [4]在接下来的4个字节的所有样本的大小(它在程序中使用)

回答

2

你开始尝试优化之前,你确定这是一个问题后?你是否真的在分析器中运行你的代码,并确定一些额外的时钟周期循环是减慢程序的最大因素,而不是磁盘I/O或其他地方发生的事情?

在平均情况下,memcmp可能不会比滚动自己的函数来比较和计算偏移量慢很多,并且与磁盘I/O的影响和实际最终的任何处理这样做。

*编辑*删除了破碎的例子。


+0

不,我没有在...分析器中运行我的代码。 (我不知道它是什么?) 我不是很熟练的程序员,但我确信如果有非常大的“额外”子块,这种优化将有助于节省一些机器资源(上午我对吗?)。 – yulian

+0

Profiler上的信息: http://stackoverflow.com/questions/1794816/recommendations-for-c-profilers – Nobilis

+0

'strstr()'返回什么类型? – yulian

0

此功能会做到这一点:

int match(char *a, const char *b) { 

    int matches = 0; 

    if(a[3] == b[0]) 
     matches = 1; 
    if(a[2] == b[0]) 
     matches = 2; 
    if(a[1] == b[0]) 
     matches = 3; 
    if(a[0] == b[0]) 
     matches = 4; 

    return matches; 
} 

int main() 
{ 
    ... 
    step = match(buf, dataID); // number of matched letters 
    fseek(input, -step, SEEK_CUR);  // sets `pointer` to the beginning of "data" 

    return 0; 
} 
+0

问题是,我与'const char'比较的字符串可以开始像这样'??? d'或'?? da'或'?dat' ... – yulian

+0

这会给你多久,直到两个字符串分歧,这是一个不同的问题。他经过了两段时间后才会聚合。 – Sysyphus

+0

看我的编辑,让我知道如果它仍然无法正常工作。 – Nobilis

相关问题