• 締切済み

テキストの内容を部分的にコピー

十数行あるテキストファイルの内容を、 下5行だけ他のテキストファイルにコピーするプログラムを作りたいのですが、ファイルのアクセス位置をどうしたらよいでしょうか。 全体をコピーするところまでは出来たのですが、 下5行を指定するという部分がうまくいきません。 fseekを使えばいいかと思っているのですが、いい方法はないでしょうか。 よろしくお願いします。

みんなの回答

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

#include <stdlib.h> #include <stdio.h> #include <errno.h> #define LAST 5 char *prog; void usage(void) { fprintf(stderr,"%s fin [fout]\n", prog); exit(1); } int main(int argc, char *argv[]) { FILE *fin, *fout; int c, i; long last[LAST+1]; prog = argv[0]; if (argc < 1) { usage(); } if ((fin = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "Can't open %s\n", argv[1]); perror(prog); exit(errno); } if (argc <= 2) { fout = stdout; } else if ((fout = fopen(argv[2], "w")) == NULL) { fprintf(stderr, "Can't open %s\n", argv[2]); perror(prog); exit(errno); } for (i = 0; i < LAST+1; i++) { last[i] = 0; } while((c = getc(fin)) != EOF) { if (c == '\n') { for (i = 1; i < LAST+1; i++) { last[i-1] = last[i]; } last[LAST] = ftell(fin); } } fseek(fin, last[0], 0); while((c = getc(fin)) != EOF) { putc(c, fout); } fclose(fin); fclose(fout); exit(0); }

masamasa122
質問者

お礼

全部の処理をありがとうございます。 for (i = 0; i < LAST+1・・・の部分からやっているのでしょうか。 自分の知識からいうと、ちょっとわからない部分もあり複雑です・・・ 参考書を調べながら一つ一つの処理を見ていこうと思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

1行の最大サイズが概ね予想できるなら、 ファイルの最後から5行分のサイズを読込み改行の数を数えて、 5行を確定して取り出すとか 十数行なら、 5行分の領域を準備して、 リングバッファ的に読み出すとか

masamasa122
質問者

お礼

ありがとうございます。 頭ではわかっているのですが、どう処理したらいいかわらないのです・・・