【发布时间】:2013-05-23 05:55:07
【问题描述】:
程序适用于 .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);
}
}
“数据”之前可以有很多扩展子块,所以我要优化程序:
- 如果接下来的 4 个字节包含“....”,则复制接下来的 4 个字节。 (跳过 3 个不必要的操作)
- 如果 "...d" 然后
fseek(input, -1, SEEK_CUR);/* 在 "d" 之前设置 pionter */ 然后复制接下来的 4 个字节。 - 如果 "..da" 然后
fseek(input, -2, SEEK_CUR);/* 在 "d" 之前设置 pionter */ 然后复制接下来的 4 个字节。 - 如果 ".dat" 然后
fseek(input, -3, SEEK_CUR);/* 在 "d" 之前设置 pionter */ 然后复制接下来的 4 个字节。
问题是我不明白如何比较“...d”和“data”。 IE。如何找出char comp_dataID[4]; 是否包含“...d”或“..da”或“.dat”。
问题:是否有任何函数可以执行此操作(返回匹配的字符数:0 表示“....”,1 表示“...d "等等)?
...或者我将使用for() 循环 ti 找到“d”,然后找到“a”,然后找到“t”。并根据结果,在“d”之前设置 pionter 以便复制接下来的 4 个字节(“数据”)。
附言 在这个 char[4] 之后接下来的 4 个字节是所有样本的大小(在程序中使用)
【问题讨论】: