こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイル書込みで一行もしくは部分的に上書きする

教えて下さい。
下のようなテキストデータがあります(sample01.txtとします)
(内容)
1111000000000000
1111000000000000
1111000000000000
これを
1111000000000000
1111001111110000
1111000000000000
と言うふうに2行目もしくは部分的に上書きして保存したいです。
よろしくお願いします。

投稿日時 - 2011-05-31 18:28:55

QNo.6777175

困ってます

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

この問題に対するよくある解決策です。下に行くほど手間ですが大きなデータが扱えるようになります。

1.ファイルが小さければ、全部配列に読み込んで、必要な操作を行ったあと同じファイル名で書き出す

2.ファイル名を変更してバックアップファイルとする作る。
バックアップを読み込み専用で開き、元のファイル名で新しいファイルを書き込みモードwで開く。

1行ずつfgetsで読み込み、ファイルにfputsで書き出す。
操作したい行が来たらその操作を行って同様にファイルに書き出す。
残りを全部書き出しす。
全部成功したらバックアップを削除する。エラーが起きたら編集中のファイルは削除してバックアップを元のファイル名にする

3.1行の長さを決まった長さにして(いわゆる固定長レコード)r+モードでfopenし、レコード長xレコード数で目的の場所にfseekして特定のレコードをfread/fwriteで上書きする。レコードの修正かレコードの末尾の追加の操作は効率がいい。レコードの挿入・削除が発生するときは全部fread/fwriteする。

4.ファイルが巨大で全部fread/fwriteするが重い処理になるなら、別途索引ファイル(インデックス)をつくり、レコードの追加はファイル末尾に追記し、インデックスファイルに検索キーとレコードの番号かファイルポインタの位置を記録する。これで目的のレコードがファイル中のどこにあるかを知ることができる。レコードの削除はインデックスに目印をつけるだけにして、実際にディスクから消去するのは負荷の低いときにガベージコレクションで行う。

5.4までやるくらいなら出来合いのデータベースを使うほうがよい。MySQLとかPostgresqlなど。

投稿日時 - 2011-06-02 02:30:55

お礼

回答頂きありがとうございます。
今回はデータがあまり大きくなかったので1のように配列で処理しました。
ファイルの大きさなどにより、いろいろな手法があるのですね
次回の参考にさせて頂きます。

投稿日時 - 2011-06-02 08:04:53

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

ファイルシステム 関数をつかいます。

参考URL:http://www.php.net/manual/ja/ref.filesystem.php

投稿日時 - 2011-05-31 19:25:40

お礼

ありがとうございます。
一行読込(fgets)があったので一行書込みもあると思ったのですが
やはり出来ないみたいですね。
参考URLをもうちょっと調べてみます。

投稿日時 - 2011-06-01 08:24:08

ANo.1

どの言語を使うのかわかりませんが、
ランダムデータ(バイナリデータ)なら可能ですが、
テキストデータの場合、基本的に部分的に書き込む事は出来ません。

しかし、テキストデータで特定の行を書き換える事は不可能ではありません。
要は、書き換えたい行のデータは変更して、それ以外のデータはそのままで、
1行目から最終行まで書き込めば、見た目で部分的な上書き保存になります。
これが一番単純でしょう。

投稿日時 - 2011-05-31 19:20:15

お礼

ありがとうございます。
一行読込(fgets)があったので一行書込みもあると思ったのですが
やはり出来ないみたいですね。
一度全部読み込んで、特定行を変更・書込みですね。

投稿日時 - 2011-06-01 08:21:50

あなたにオススメの質問