私は、相変わらず 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 を使ってみるか。
悩むのぅ…