• ベストアンサー

テキストファイルから指定区域の読み取り

ネットの情報を受信してそのソースをテキストに書き出し、その一部を読み取るプログラムを作っている所なのですが、一部を読み取る所ができなくて悩んでいます。 特定の文字2つをキーワードにしてその間の行を表示させたいのですが、fgets関数を使えばいいのでしょうか? fp = ("12345.txt","r"); for(i=1;;i++){ if(fgets(line,1000,fp)==NULL){ if(ferror(fp)){ return -1; } if(feof(fp)) break; } if(i>counter && i<counter2){ printf("%s\n",line); } fclose(fp); このようにプログラムを組んでみてもできなくて困っています。 教えていただけたらうれしいです! イメージとしては、 ____________12345.txt_________________________ ajskd;flaskdjfids;fnmajcim;あいうa;sdlkfjaksl;dj sajdkfa;sldjfksdfjaisdf;jasdfne;lje;lijfla;efjja jal;jfnijndvdjfl;adsjfalsidjfalsidfjlaisdjf ajsdlf;jasildfja; ajsdfljaa aja ajdsfliajsdlf;iajdfli;jd ajsdiflajdfliajsdlfja ajdiflajdlfijdlaijfliasjliかきくasdf ajskdlf;jalksdjfaksdjfa ________________________________________________          ↓ sajdkfa;sldjfksdfjaisdf;jasdfne;lje;lijfla;efjja jal;jfnijndvdjfl;adsjfalsidjfalsidfjlaisdjf ajsdlf;jasildfja; ajsdfljaa aja ajdsfliajsdlf;iajdfli;jd ajsdiflajdfliajsdlfja このように「あいう」の下の行から「かきく」の上の行まで表示させることをしようとしています。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★フラグ変数を用意すれば良い。 ・行単位で取得して『あいう』の行を探す。  次に『かきく』の行が見つかるまでを抽出すればよいだけ。  このときにフラグ変数を用意して制御します。 >特定の文字2つをキーワードにしてその間の行を表示させたいのですが、 >fgets関数を使えばいいのでしょうか?  ↑  この関数で出来ます。 ・下にサンプルを載せておきます。 サンプル: char buff[ 1024 ]; FILE *fp; int flag = 0; ←初期化(OFF) if ( (fp = fopen("12345.txt","r")) != NULL ){  while ( fgets(buff,sizeof(buff),fp) != NULL ){   if ( strstr(buff,"かきく") != NULL ){    break;   }   if ( flag ){    printf( "%s", buff ); ←抽出   }   else if ( strstr(buff,"あいう") != NULL ){    flag = 1;   }  }  fclose( fp ); } 以上。

familir
質問者

お礼

ありがとうございます! >★フラグ変数を用意すれば良い。 フラグ変数をすっかり忘れていました。 これで上手くいきそうです! 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★本当、惜しいですね。 ・サンプルを作っているときにif ( flag ){}ブロックに『strstr(buff,"かきく")』を  記述したほうが良いかなとも思いました。  でも『かきく』が『あいう』の行より前に現れないだろうと思い速度面から回答No.1の  ようにしました。やっぱ良くないですね。  chie65536 さんありがとうございました。 ・そこでちょっと書き換えました。 サンプル: char buff[ 1024 ]; FILE *fp; int flag = 0; ←初期化(OFF) if ( (fp = fopen("12345.txt","r")) != NULL ){  while ( fgets(buff,sizeof(buff),fp) != NULL ){   if ( flag ){    if ( strstr(buff,"かきく") != NULL ){     break;    }    printf( "%s", buff ); ←抽出   }   else if ( strstr(buff,"あいう") != NULL ){    flag = 1;   }  }  fclose( fp ); } これでいいのかな? 最初からこうすれば良かったです。 以上。

familir
質問者

お礼

2度も教えてくださりありがとうございます! プログラマになったらあらゆるバグを想定しないといけないということですね。 本当に助かりました! ありがとうございました。

すると、全ての回答が全文表示されます。
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

ANo.1の回答、惜しい! ANo.1では「かきく」での終了を無条件に判定しているので 『もし、「あいう」が現れる前に「かきく」が現れると、1行も表示せずに終ってしまう』と言うバグがあります。 例えば ____________12345.txt_________________________ ajdiflajdlfijdlaijfliasjliかきくasdf ajsdiflajdfliajsdlfja ajskd;flaskdjfids;fnmajcim;あいうa;sdlkfjaksl;dj sajdkfa;sldjfksdfjaisdf;jasdfne;lje;lijfla;efjja jal;jfnijndvdjfl;adsjfalsidjfalsidfjlaisdjf ajsdlf;jasildfja; ajsdfljaa aja ajdsfliajsdlf;iajdfli;jd ajsdiflajdfliajsdlfja ajdiflajdlfijdlaijfliasjliかきくasdf ajskdlf;jalksdjfaksdjfa ________________________________________________ だと、1行も表示せずに終ってしまいます。

familir
質問者

お礼

サンプルをいじらせてもらっていて気づきませんでした。 確かにそうですね! でも今回の場合に限っては「かきく」は前にこないので大丈夫でした。 ありがとうございます!

すると、全ての回答が全文表示されます。
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

まず「無条件に、1行目から最終行まで、全部そのまま表示する」と言う、以下のようなプログラムを作りましょう。 1.ファイルを開く 2.for(;!feof(fp);)で「EOFでなければループ」のfor文でループ 3.1行lineに読む 4.読んだlineを表示する 5.ループで2.に戻る 6.ファイルを閉じる まず、これがうまく動かないと、お話になりません。 うまく動いたら、このプログラムに「1行読んだあと、ある条件の時だけ表示しない」と言うのを追加しましょう。 0.フラグfをfalse(偽)に初期化する 1.ファイルを開く 2.for(;!feof(fp);)で「EOFでなければループ」のfor文でループ{ 3.1行lineに読む 3-1.もし、フラグfが真なら{ 3-2.もし、lineに、終りを示す単語「かきく」があったら{ 3-3.ループ終了して良いのでbreak; 3-4.}else(フラグfが真じゃなかったら){ 3-5.もし、lineに、始めを示す単語「あいう」があったら{ 3-6.フラグfをtrueにする 3-7.}else(単語「あいう」が無かったら){ 3-8.表示しちゃいけないので、continue;でループの頭に戻る} 3-9.}(3-5の判定文はここまで) 3-10.}(3-2の判定文はここまで) 4.読んだlineを表示する 4-1.}(3-1の判定文はここまで) 5.ループで2.に戻る} 6.ファイルを閉じる 具体的には、 ・最初「あいう」が現れるまではフラグfをfalseにしておく ・読み込みは常に行なう ・フラグfがfalseの間は表示はしない。但し「あいう」が含まれているかはチェックし、あったらフラグfをtrueにする ・フラグfがtrueの間は、表示前に「かきく」があるか調べ、あったらループを終了して抜ける。「かきく」が無かったら表示 と言うチェックを入れる訳です。

familir
質問者

お礼

流れまで教えていただきありがとうございます! やはりフラグが鍵でしたね。

すると、全ての回答が全文表示されます。

関連するQ&A