• 締切済み

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

十数行あるテキストファイルの内容を、 下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
質問者

お礼

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

関連するQ&A

  • テキストファイルの内容を部分的に残したい

    あるフォルダ下のすべてのテキストファイルについて、?から始まる部分の内容しか残したいです。 ============ 例えば、 jkl;j; じおうおういおういお「 ?じおじょじょ jkjl;; ============== 上記の場合、上の2行を削除したいです。 下の2行だけを残したいです。(?からの部分) ファイルが多いため、WHSで実現したいです。 どうやって、できるでしょうか? 教えてください!(サンプルが欲しいです。) お願いいたします。

  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP
  • テキストファイルの内容を、フォームに表示したい

    (Microsoft Access) 単純な関数を使って、 保存されているテキストファイルの内容を、 フォームに表示したいのですが、 行を指定して表示できる関数はないでしょうか? (もとのテキストファイルが変更されれば  表示される内容も変更されるように) FileDateTime のように ファイル名と、表示したい行を指定できる 簡単な関数があれば、教えてください。

  • VBAでテキストコピーをする時に

    でテキストファイルの内容をコピーする時に、コピー元のディレクトリと、保存先のディレクトリを毎回指定できるプログラムをVBAで書きたいのですがわかりません。 どなたかご教授いただけないでしょうか?

  • テキストファイルのコピー直後に名前変更

    VB2008初心者です。どうしても解決できないエラーが発生してしまったので、質問させていただきました。 処理内容と、問題点は次の通りです。 1.処理内容  (1)テキストファイルを指定フォルダに、拡張子を.tmpに書き換えてコピー。  (2)コピーし終わった直後に.tmpを.txtに変更。 2.エラー内容  (1)コピーまでは問題ないが、その直後の.txtに書き換える時に、   他のユーザーアクセス中のエラーが発生してしまい、永遠にループ   する。  テキストファイルに複数のユーザーがアクセスするため、コピー中 のアクセスを防ぐ為、コピー中は違う拡張子でコピーし、コピーが終了したら拡張子を戻すということをしたいのですが、どうもうまくいきません。うまく上記の動作をスムーズに行う為の方法を教えていただきたいと思います。よろしくお願いします。

  • 複数のテキスト内容を一つにしたい

    たとえば A・B・C という3つのテキストファイルがあったとして、 Aには あ い う Bには か き く Cには さ し す という内容があるとします。 通常 A・B・C の3つのファイルを一つにするには、それぞれコピー/張り付けで D (新規テキスト) あ い う か き く さ し す というようにできますが、実はテキストファイルが 300 ほどあってなんとか他の方法で簡単に一つのテキストファイルできないかと思っています。 このようなことができるソフトがありますか。 Win95です

  • c言語:ファイルのアクセス場所指定

    指定したファイルの中身の、文章の最後の8行を、出力ファイルに書き出すプログラムを作っています。 まず、fseek(file_p, -1, SEEK_END);でファイルの読み込み位置を一番最後にして、そこからループで8行分を数え、8行目の最初から書き出していけるようにしたいのですが、ループ処理の方法がわかりません。 どうしたら最後から8行を数えることができますか?

  • テキストファイルの行数を指定してとばす方法

    Java初心者です。 テキストファイルの中のある1行を読み込むプログラムを作成したいと思っています。その際、毎回先頭から読み込むのでは効率が悪いので指定した行に直接アクセスしたいのですが、その方法がよく分からないので教えていただけませんか? BufferedReaderやLineNumberReaderをループで回すのではなく、ランダムアクセスをすればよいというところまでは分かっているのですが、ランダムアクセスの方法が今ひとつ分かりません。

    • ベストアンサー
    • Java
  • テキストレイヤーのコピーってどうするのでしょうか?

    Photoshop7.0にて同じ大きさ(px)2つのファイルを開いているのですが、一方にあるのテキストレイヤーをもう一方にも同じ位置にコピーしたいと思っています。 ですが、テキストレイヤーをレイヤーパレットで選択してコピーしようとしても出来ません。どうすればよいのでしょうか? コピー出来るのなら、複数のレイヤーを一発で同じ位置にコピー出来るのでしょうか? 初歩的な質問ですが、よろしくお願い致します。

  • テキスト保存

    ご教授お願い致します。  ユーザー様より以下の要望がりましたので  その可否並びに可能な場合はその方法を  お願い致します。  プログラムにテキストへの抽出という  機能がありまして、それを実行すると  (1)ファイルの保存先ダイアログが起動します。  (2)そこで、ファイル名を任意に指定し、保存のボタンを押します。  (3)その対象レコードがテキストファイルに書き込んでいく   作業となります。  よって、(2)の時点ではテキストファイルは存在しません。  そのため、(2)のファイル名を指定の部分で、(3)のテキストファイルの  1行目に任意の題名を自動作成した上で2行目からレコードの  書き込みができるようにしたい。  以上、ご回答お願い致します。