いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

いや〜困った。^^;

私は、相変わらず DirectX やら Win32 やら弄ってる人なんですが、そんな中 C標準のファイル入出力関数で躓きました。 ^^; なんか、えらいショック(苦笑
やりたい事は「ファイルを読んで、処理して、同じファイルに書き戻す」という処理。で、問題点としては「書き込んだファイルが正常じゃない」というもの。

1つのファイルに読み込み・書き込みをしたいので、"r+" で開きました。"a+" だと追記しか出来ませんし、"w+" だと、開いた瞬間にファイルが空になってしまうため、どうしようもありませんからね。^^;

でー、どんな風におかしくなるのかと言うと、例えばファイル"manna.txt" に

BBBB

と書かれていたとしましょう。このファイルに対して次のようなコードを書いたとしましょう。

FILE* pFile = fopen("manna.txt","r+");
// 本来はココに読んで処理するコードが入る。
fseek(pFile, 0, SEEK_SET);
fputs(pFile, "a");  // "a" という文字だけのファイルにしたい!
fclose(pFile);

すると、ファイルの内容が

aBBB

に…


… EOF が書き込まれて無ぇぇぇーーーーー!! orz

…てっきりクローズしたら、現在のファイルポジションにEOFを書いてくれるものだと信じていたのですが…どうやら、私は裏切られてしまったようです。(違

Win32 で CreateFile したハンドルであれば、SetEndOfFile して EOF を書き込めるのですが、CRTにはEOFを書き込む関数なんて無いようで…さて困った…。どいういうアプローチを取るべきだろうか……。

別ファイルを作って、リネームするか。
ファイルを開きなおすか。
_chsize ちゅー関数を使ってみるか。
_get_osfhandle を使ってみるか。

悩むのぅ…