私は、さまざまな文字列を散りばめたバイナリデータのファイルを持っています。私は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
はそれを検出しません。コードはファイル全体を読み込み、検索文字列を決して見つけません。
CHUNK_SIZE
を128から50000に変更しようとしましたが、結果に変更はありません。私はまたback_step
を変えてみました。私はstrstr
が文字列を見つけられなかったときにchunk
文字を印刷する診断コードを入れてしまっていて、確かにその文字列は正しいと思われる場所です。 pos
の診断出力は常に正しいです。
どこに間違っているのか教えていただけますか? strstr
は間違ったツールですか?
これは必ずしも問題ではありませんが、(SEEK_CURからの負のオフセットのような)任意のシークを使用するには、ストリームをバイナリモードで開く必要があります。あなたのストリームはテキストモードで開いています。 – AnT
また、バイナリファイル、つまりゼロバイトのファイルを検索する可能性はありますか? – AnT
@AnTええ、それはおそらくそれです。ありがとう。 –