C言語関係掲示板

過去ログ

No.115.ファイルの途中にデータを挿入


No.655

Cによるファイル入出力
投稿者---りえ(2001/12/08 15:12:41)


例えば、読みこむファイルが
1 2 3
3 3 3
3 3 3
みたいになってたとします。このファイルを読みこんで、この読みこんだファイルに追加で値を加えて、同じファイル名で追加したいのですが、
通常、”a”追加書きこみ設定で行うと、
最後の行から、追加されますよね。
私がしたいのは、入力ファイルの行数が例えば、100行あったとすると、20行目の後、40行目、60,80、100行目の後にそれぞれ、ある値を
追加したいのですが、何かいい方法ご存知でしょうか?



No.658

Re:Cによるファイル入出力
投稿者---shu(2001/12/08 18:12:42)
http://c2c-1.rocketbeach.com/~finder_s/ccc/



要するに、データの挿入がやりたいんですね。

http://graphics.sfc.keio.ac.jp/lecture/cgsys2001/index.html
第02回(10/23) 線形デ−タ構造 資料 課題
に、それらしい内容と問題がのっていましたが、
ちょっと難しいかもしれません(自分もまだ使いこなせてません)が
一応紹介しておきますね。






No.672

Re:Cによるファイル入出力
投稿者---りえ(2001/12/09 15:30:18)


思考錯誤の末、何とかできました。ありがとうございました。

No.662

Re:Cによるファイル入出力
投稿者---kikk(2001/12/09 00:07:02)


ども。


1. 一番簡単(安直)な方法
ファイルを"r+"で開いて、内容を全部読み込んで保持してから、rewindして、
新しいデータを挿入しつつ書き出す。消費メモリ的に問題がなければこれが
よいかと。ファイル(データ)のサイズに制限をつけるかつけないかでプログラム
の複雑さがかなり違ってきます。。

2. メモリに制限がある場合
別のファイルを(別の名前で)作り、そこに新しいデータを挿入しつつ書き出す。
そのあと、そのファイルの名前を元のファイルの名前にする。tmpnam(),remove(),
rename()あたりを使えばよいかと(開いたまま消したり名前を変えたりしないように)。

3. メモリにもディスクにも制限がある場合
ファイルを"r+"で開いて、後ろから、データを読み込んでは移動、を繰り返す。
具体的には、はじめに、20,40,60,80行目のあとに挿入するデータのバイト数
だけファイルの最後のデータを移動し、そのあとに100行目のあとに加えるデータ
を書き込む。そのあと前にもどって、データ移動によって作ったスペースに80行目
のあとに挿入するデータを書き込んで、そのあとまた、20,40,60行目のあとの
データ分だけデータの移動...を繰り返す。改行コードが2バイトだった場合、
データの移動量が変わるのでうまくいかないかもしれません。その場合は"r+b"で
開いて、移動量を考慮し、自前で改行まわりを処理しなければなりません。

もっと簡単なのは、処理系で用意されている、ないし、どこかで公開されている
適当なライブラリを使うといった方法でしょうか。あと、C++で複数の行データを
取り扱うクラスが(その処理系で)用意されているかもしれませんので、そこだけ
それを使うのもありかと。
# もちろんこれらの方法は移植性が保証されません


では。

No.673

Re:Cによるファイル入出力
投稿者---りえ(2001/12/09 15:31:11)


助かりました。ありがとうございました。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved