ネットの情報を受信してそのソースをテキストに書き出し、その一部を読み取るプログラムを作っている所なのですが、一部を読み取る所ができなくて悩んでいます。
特定の文字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
このように「あいう」の下の行から「かきく」の上の行まで表示させることをしようとしています。
よろしくお願いします。
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 );
}
以上。
ありがとうございます!
>★フラグ変数を用意すれば良い。
フラグ変数をすっかり忘れていました。
これで上手くいきそうです!
本当にありがとうございました。
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の間は、表示前に「かきく」があるか調べ、あったらループを終了して抜ける。「かきく」が無かったら表示
と言うチェックを入れる訳です。
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行も表示せずに終ってしまいます。
サンプルをいじらせてもらっていて気づきませんでした。
確かにそうですね!
でも今回の場合に限っては「かきく」は前にこないので大丈夫でした。
ありがとうございます!
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 );
}
これでいいのかな?
最初からこうすれば良かったです。
以上。
2度も教えてくださりありがとうございます!
プログラマになったらあらゆるバグを想定しないといけないということですね。
本当に助かりました!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
break文でループを一気に抜ける...
-
if文を使わずに奇数・偶数を判断
-
PAD図の書き方
-
for文while文の無限ループの違...
-
C言語forループが完結した場合...
-
桁数を求めるプログラム。
-
アルゴリズムです!四つの数字...
-
C言語 キーボードで入力された...
-
階層型ニューラルネットに準ニ...
-
IF文での条件の書き方について(...
-
While文の終わりにセミコロンが...
-
2÷3などの余りについて
-
C言語で%を使わない余りの出し方
-
比較回数と交換回数表示について
-
信頼区間の1.96や1.65ってどこ...
-
nCmの関数
-
複数桁10進数の*桁目だけを抽出...
-
Notepad++の関数リスト表示の変...
-
C言語のfor文です。 繰り返しの...
-
正負を反転させて出力するプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
ループを途中で抜けたいのですが。
-
入力した数値を倍々するプログラム
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
C言語forループが完結した場合...
-
エクセルでC言語のfor文と同じ...
-
Excel VBAで年度をまたぐ期間の...
-
For文の終了値を関数にしても問...
-
エクセルVBAで Do While (1)って?
-
C言語、whileループを抜け出す...
-
PAD図の書き方
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
他言語で言うcontinue文
-
C言語のプログラムみてください...
-
ループの特定入力終了
-
COBOLのEVALUATE文
-
for文while文の無限ループの違...
おすすめ情報