0

程序适用于 .wave 文件。

下面的代码是查找“数据”子块的程序的一部分。它将所有必要的块写入输出文件,然后找到"data"(将接下来的 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);
    }
}

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

  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”和“data”。即如何找出是否char comp_dataID[4];包含“...d”或“..da”或“.dat”。


问题:是否有任何函数可以执行此操作(返回匹配的字符数:在“....”的情况下为 0,在“...d”的情况下为 1,依此类推。)?

...或者我将使用for()循环 ti 找到“d”,然后找到“a”,然后找到“t”。并且根据结果,在“d”之前设置 pionter 以便复制接下来的 4 个字节(“数据”)。

PS 在这个 char[4] 之后接下来的 4 个字节是所有样本的大小(它在程序中使用)

4

2 回答 2

2

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

在一般情况下,memcmp 可能不会比滚动您自己的函数来比较和计算偏移量慢多少,并且与磁盘 I/O 的影响和您实际最终执行的任何处理相比,可能是最小的贡献。

*编辑*删除了损坏的示例。


于 2013-05-28T10:00:40.123 回答
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;
}
于 2013-05-28T10:13:41.473 回答