我有一個二進制數據文件與各種字符串灑在整個。我正在嘗試編寫一個C代碼來查找文件中第一次出現用戶指定的字符串。 (我知道這是可以使用bash做,但我需要其他原因的C代碼)的代碼,因爲它代表的是:strstr中的微妙?
#include <stdio.h>
#include <string.h>
#define CHUNK_SIZE 512
int main(int argc, char **argv) {
char *fname = argv[1];
char *tag = argv[2];
FILE *infile;
char *chunk;
char *taglcn = NULL;
long lcn_in_file = 0;
int back_step;
fpos_t pos;
// allocate chunk
chunk = (char*)malloc((CHUNK_SIZE + 1) * sizeof(char));
// find back_step
back_step = strlen(tag) - 1;
// open file
infile = fopen(fname, "r");
// loop
while (taglcn == NULL) {
// read chunk
memset(chunk, 0, (CHUNK_SIZE + 1) * sizeof(char));
fread(chunk, sizeof(char), CHUNK_SIZE, infile);
printf("Read %c\n", chunk[0]);
// look for tag
taglcn = strstr(chunk, tag);
if (taglcn != NULL) {
// if you find tag, add to location the offset in bytes from beginning of chunk
lcn_in_file += (long)(taglcn - chunk);
printf("HEY I FOUND IT!\n");
} else {
// if you don't find tag, add chunk size minus back_step to location and ...
lcn_in_file += ((CHUNK_SIZE - back_step) * sizeof(char));
// back file pointer up by back_step for next read
fseek(infile, -back_step, SEEK_CUR);
fgetpos(infile, &pos);
printf("%ld\n", pos);
printf("%s\n\n\n", chunk);
}
}
printf("%ld\n", lcn_in_file);
fclose(infile);
free(chunk);
}
如果你想知道,back_step
放在採取不太可能的護理有問題的字符串被分割爲chunk
邊界。
我想要檢查的文件大小約爲1Gb。問題是,由於某種原因,我可以在前9000個左右的字節中找到任何字符串,但除此之外,strstr
以某種方式未檢測到任何字符串。也就是說,如果我查找位於文件的9000或更多字節的字符串,則strstr
不會檢測到它。該代碼讀取整個文件並從未找到搜索字符串。
我嘗試過從012到30000變化CHUNK_SIZE
,結果沒有變化。我也嘗試過不同的back_step
。我甚至在診斷代碼中輸入chunk
字符,當strstr
找不到字符串時,並且確定該字符串正是它應該是的位置。診斷輸出pos
始終正確。
誰能告訴我我哪裏出錯了嗎?是strstr
這裏使用的錯誤工具?
雖然這不一定是問題,爲了使用任意的追求(如從負'SEEK_CUR'偏移),你必須以二進制方式打開的流。您的流在文本模式下打開。 – AnT
另外,是否有機會通過二進制文件進行搜索,即是否有零字節的文件? – AnT
@安泰是的,可能就是這樣。謝謝。 –