• 締切済み

同一ファイルからの文字列検索

お世話になります。 今、ファイル処理を勉強しています。 hoge.txtに文字列が格納されています。 (hoge.txt) --------------------- suzuki yamada kimura tanaka ito suzuki kimura --------------------- hoge.txtの上の行より、下に検索を行い、 一致した場合、printf("HIT\n");と出力します。 動きは、 suzukiを検索文字列し、yamada~kimuraまで検索を行い、 もしヒットした場合、出力表示します。 suzukiが検索終了すると、次のyamadaを検索文字列として、 kimura~kimuraを検索します。 この動作を最後の行まで行えば終了です。 下記のfgets()で1行分を取得してからの 次の行への移行がわかりません。 FILE *fp; char name[256]; if( (fp =fopen( "hoge.txt", "r )) == NULL ){ return 0; } while( fgets(name, sizeof(name), fp ) != NULL ){ //ここで次の行以下とstrstr()で比較を行う } お手数をお掛けしますが、よろしくお願い致します。

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

全部メモリに先に読み込んだ方が高速ですが、あえて遅いファイル処理で全てを操作したいと言う事でよろしいですか? ファイルを2度、3度と読み直す必要がありますので、ファイルの読み込み位置を変更する関数fseekと現在の読み込み位置を取得するftellを使用します。 name以外に比較するバッファを必要としますので、 char buff[256]; も確保してください。 ループを二重にして、中のループはbuffにnameと同じようにリードします。中のループではif文でnameとbuffを比較します。ここは、strstr()ではなくstrcmpを使いましょう。同じならprintf("HIT\n");です。 で、問題なのはいちどファイルの最後まで読み終わっているのでファイルの読み込み位置を戻すことです。これにはfseekを使用します。 fseek(fp,SEEK_SET,pos); posは、ファイルの読み込み位置でintの変数です。この値は事前に読み込みを開始する位置を得ておく必要があります。 pos = ftell(fp);を何処かに入ればよいのですが、これは自分で考えてみてください。宿題です。 でも、誰かが答えを書いてしまう気がしますが(^^ゞ

関連するQ&A