• ベストアンサー

指定の行をループさせてファイルに出力

C言語で"input.txt"内の文の行範囲と 繰り返す回数をキーボードから入力することにより 結果を"output.txt"に出力するプログラムを考えているのですが、うまくできません。 具体例を以下に示しておきます。 ----input.txt---- aaaa bbbb cccc dddd eeee ------------------ キーボードから繰り返す範囲、2行目と4行目を指定。 繰り返す回数を2回に指定。 ----output.txt---- aaaa bbbb cccc dddd bbbb cccc dddd eeee ------------------- と、こんな感じにしたいです。 指定した行範囲を"output.txt"に出力することはできたのですが 繰り返しの部分がうまくできません。 どなたかご教授お願いします。 自分が作ったプログラムを下に載せておきます。 これをベースに作れたらいいのですが・・・ #include<stdio.h> #include<stdlib.h> #define STR_MAX 256 int main (void) { FILE *fpin, *fpout; char buff[STR_MAX]; int line = 1; int start; int end; printf("start >>"); scanf("%d",&start); printf("end >>"); scanf("%d",&end); if((fpin = fopen("input.txt","r")) == NULL) { printf("infile can't open\n"); exit(EXIT_FAILURE); } if((fpout = fopen("output.txt","w")) == NULL) { printf("outfile can't open\n"); exit(EXIT_FAILURE); } while(fgets(buff,STR_MAX,fpin) != NULL) { if((line >= start)&&(line <= end)) { fputs(buff,fpout); } line = line + 1; } fclose(fpout); fclose(fpin); return EXIT_SUCCESS; }

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

  • ベストアンサー
回答No.2

配列に入れておくのも良いけど、範囲が「2行目から30000行目」とかだと、巨大な配列が必要になります。 なので「2回目以降は、入力ファイルを頭から読み直し、必要な行のみ出力する」と言う方法を使うのが良いでしょう。 「2行目から4行目を、3回繰り返し」の場合、以下のようになります。 1回目 aaaa←出力する bbbb←出力する cccc←出力する dddd←出力する eeee←出力しない 2回目 aaaa←出力しない bbbb←出力する cccc←出力する dddd←出力する eeee←出力しない 3回目 aaaa←出力しない bbbb←出力する cccc←出力する dddd←出力する eeee←出力する 「出力する」と書かれた行を抜き出すと aaaa←出力する bbbb←出力する cccc←出力する dddd←出力する bbbb←出力する cccc←出力する dddd←出力する bbbb←出力する cccc←出力する dddd←出力する eeee←出力する となり「2行目から4行目を、3回繰り返し」された結果が出力されます。 プログラムは以下のようになります。 #include<stdio.h> #include<stdlib.h> #define STR_MAX 256 int main (void) { FILE *fpin, *fpout; char buff[STR_MAX]; int line; int start; int end; int loop; int count; printf("start >>"); scanf("%d",&start); printf("end >>"); scanf("%d",&end); printf("loop >>"); scanf("%d",&loop); if((fpout = fopen("output.txt","w")) == NULL) { printf("outfile can't open\n"); exit(EXIT_FAILURE); } for (count = 1;count <= loop;count++) { if((fpin = fopen("input.txt","r")) == NULL) { printf("infile can't open\n"); exit(EXIT_FAILURE); } line = 1; while(fgets(buff,STR_MAX,fpin) != NULL) { if(((count == 1)&&(line <= end))||((line >= start)&&(line <= end))||((count == loop)&&(line >= start))) { fputs(buff,fpout); } line++; } fclose(fpin); } fclose(fpout); return EXIT_SUCCESS; }

imorimaru
質問者

お礼

なるほど! if文の条件をこんな感じにすると実装できるんですね! あれから数時間考えていましたが、この条件は全然思いつきませんでした・・・ アルゴリズムの考え方が面白いですね。 これから他のプログラムを作る上で参考にさせていただきます。 ありがとうございました。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

入力ファイルの内容を配列に格納すれば実装できます。その際、  ・繰り返す範囲(開始行、終了行)  ・繰り返す回数 を引数とする関数を作れば、プログラム全体の見通しがよくなるでしょう。

imorimaru
質問者

お礼

配列に格納することは考えたのですが自分の非力さあまり断念・・・ 今度時間があるときに配列を使用するやり方にチャレンジしたいと思います!

関連するQ&A