アプリ版:「スタンプのみでお礼する」機能のリリースについて

ネットの情報を受信してそのソースをテキストに書き出し、その一部を読み取るプログラムを作っている所なのですが、一部を読み取る所ができなくて悩んでいます。

特定の文字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

このように「あいう」の下の行から「かきく」の上の行まで表示させることをしようとしています。
よろしくお願いします。

A 回答 (4件)

★フラグ変数を用意すれば良い。


・行単位で取得して『あいう』の行を探す。
 次に『かきく』の行が見つかるまでを抽出すればよいだけ。
 このときにフラグ変数を用意して制御します。
>特定の文字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 );
}
以上。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/20 12:38

まず「無条件に、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の間は、表示前に「かきく」があるか調べ、あったらループを終了して抜ける。「かきく」が無かったら表示
と言うチェックを入れる訳です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/20 15:16

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行も表示せずに終ってしまいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/20 15:21

★本当、惜しいですね。


・サンプルを作っているときに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 );
}

これでいいのかな?
最初からこうすれば良かったです。
以上。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/20 15:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!