- ベストアンサー
ある行が探索できない
すいませんが、前回同じような質問をしましたが、再度質問します。文字列の探索で、 printf("Input Filename..."); scanf("%s",fname); while(1){ fp = fopen(fname, "r"); if(fp == NULL){ printf("ファイルを開くことができません...\n"); printf("Input Filename..."); scanf("%s",fname); }else break; } // fscanf(fp,"%s",fname); //1行目以外のみ可能 // fread(s1, 1000, 1000, fp); //上記 // s1 = fgetc(fp); fgets(s1, 10000, fp); //1行目のみ可能 // s1 = fscanf(fp); // s1=fp; // printf("文字列1を入力してください:"); // scanf("%s",s1); printf("文字列2を入力してください:"); scanf("%s",s2); cp = strstr(s1, s2); if(cp == NULL) printf("%sに%sのいずれの文字も含まれない.\n", s1, s2); else printf("%sの中に現れる%sという文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1); free(s1); free(s2); というプログラムを作ったのですが、仮に3行のテキストファイルを読み込ませると、コメントの通り、 fscanf(fp,"%s",fname); //1行目以外のみ可能 fread(s1, 1000, 1000, fp); //上記 とすると、2,3行目のみが探索出来て、 fgets(s1, 10000, fp); //1行目のみ可能 とすると、1行目のみが探索可能になっています。 すべての行を探索可能にするにはどうすれば良いか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
fgetsは1行(または指定文字数まで)を読みますので、すべての行を探索するなら、ファイルの終わりまで繰り返す必要があります。 読み込んだ文字列には改行コードも含まれ、文字終端'\0'もつけられます。 s2を先に入力しておいて、 while(fgets(s1,10000,fp)!=NULL) { 探索&表示 } とやればいいと思います。 ただし、1行が10000以上になる可能性があるなら、s2がちょうど10000文字目の境に来るかもしれませんので、ちょっと工夫が必要です。探索用のバッファを入力バッファ2つ分用意しておいて、ずらしながら使うとか。。。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
fgetsは一行単位で指定したバッファのサイズを超えない範囲で読み込みします。 freedは、指定したサイズ毎、指定した個数読み込みます。(ソースはちょっとあやしいような気がします、s1のサイズはいくつなのでしょうか?) 行単位で良いなら行単位で(ファイルの最後まで)繰りかえし読み込むのがよいと思います。 行をまたがるような文字列(つまり改行を含むような検索文字列)を検索する場合には、ファイルサイズを調べて、ファイルサイズがまるごと読み込めるようなバッファを用意して読み込むのが良いかもしれません。