2013年10月27日日曜日

ファイルのカット:複数のファイルオープンを行わない方法

ファイルの一部分をカットし、保存し直す例題です。

ファイルの分割や、一部を切り出して別のファイルに書き出す等の例題では、fopen にてファイルポインタを複数用いて別ファイルとして書き出すことが考えられますが(例題を準備するまでもなくいくらでも検索にヒットするでしょう)、ファイルポインタの操作では、追加書き込みしかできないため、同一ファイル上で一部分をカットし保存し直すことが不可能です。
そこで、本例題ではファイルディスクリプタを用いて、同一ファイル上の操作を行っています。

本来はこの例題にて 64bit 長のファイルサイズにも対応したものを準備したかったのですが、開発環境側の準備も必要になりますのでそちらが準備できれば両環境に対応した例題に修正して再度掲載すると言う形になります(OSX ではこのままでも 64bit 対応可能のようです)。
※ 64bit 版として利用する場合には、off64_t/lseek64 への置き換えが必要(Linux etc.)
64bitファイル対応に関して

この例題では、ftruncate にてファイルサイズを切り詰めて保存しているのですが、この関数はファイルの後半部を切り詰めたり伸長することしか対応しておらず、while 分のようにファイルの後半部分を前半に移動し直すと言う作業が必要となっています。
後半部分だけをカットする場合にはこの関数のみでも対応は可能ですが、前半部分をカットできないために下記のような例題となります。
実行結果

0 件のコメント:

コメントを投稿