• ベストアンサー

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

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

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

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

この問題に対するよくある解決策です。下に行くほど手間ですが大きなデータが扱えるようになります。 1.ファイルが小さければ、全部配列に読み込んで、必要な操作を行ったあと同じファイル名で書き出す 2.ファイル名を変更してバックアップファイルとする作る。 バックアップを読み込み専用で開き、元のファイル名で新しいファイルを書き込みモードwで開く。 1行ずつfgetsで読み込み、ファイルにfputsで書き出す。 操作したい行が来たらその操作を行って同様にファイルに書き出す。 残りを全部書き出しす。 全部成功したらバックアップを削除する。エラーが起きたら編集中のファイルは削除してバックアップを元のファイル名にする 3.1行の長さを決まった長さにして(いわゆる固定長レコード)r+モードでfopenし、レコード長xレコード数で目的の場所にfseekして特定のレコードをfread/fwriteで上書きする。レコードの修正かレコードの末尾の追加の操作は効率がいい。レコードの挿入・削除が発生するときは全部fread/fwriteする。 4.ファイルが巨大で全部fread/fwriteするが重い処理になるなら、別途索引ファイル(インデックス)をつくり、レコードの追加はファイル末尾に追記し、インデックスファイルに検索キーとレコードの番号かファイルポインタの位置を記録する。これで目的のレコードがファイル中のどこにあるかを知ることができる。レコードの削除はインデックスに目印をつけるだけにして、実際にディスクから消去するのは負荷の低いときにガベージコレクションで行う。 5.4までやるくらいなら出来合いのデータベースを使うほうがよい。MySQLとかPostgresqlなど。

seventozero
質問者

お礼

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

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

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

参考URL:
http://www.php.net/manual/ja/ref.filesystem.php
seventozero
質問者

お礼

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

  • kiki_s
  • ベストアンサー率59% (147/248)
回答No.1

どの言語を使うのかわかりませんが、 ランダムデータ(バイナリデータ)なら可能ですが、 テキストデータの場合、基本的に部分的に書き込む事は出来ません。 しかし、テキストデータで特定の行を書き換える事は不可能ではありません。 要は、書き換えたい行のデータは変更して、それ以外のデータはそのままで、 1行目から最終行まで書き込めば、見た目で部分的な上書き保存になります。 これが一番単純でしょう。

seventozero
質問者

お礼

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

関連するQ&A