そうか今日は火曜日か・・

先週は木曜休んで金曜日から土日含みで働いているせいでもう今週は十分働いた気分になっていたのだけど、今日はまだ火曜日か・・


先日リリースしたCのプログラムで、うっかりテキストモードで開いているストリーム(stdin/stdoutだけど)に対してfread/fwriteをするとWindowsだとASCIIの制御文字とか一部データが壊れるのを忘れて使っている箇所があり、タイミングによって正しく動作しないことがあるバグをひっそりと発見。こっそり対応しようかと思ったが良心が咎めたかどうかは知らんが過去のログを洗われると逃げられそうに無かったためゲロ。


具体的にはこんな処理


time_t t = time(NULL);
fwrite(&t, sizeof(t), stdout);


"b"付きでfreopenで開きなおせば良いかと思ったらfreopenするとstdin/stdoutのコマンドラインでのリダイレクトが外れてしまうらしい。あまり気が進まなかったが_read/_writeを使うとstdin:0, stdout:1 でリダイレクト先を開いたままバイナリでアクセスできるらしいので(参考)それを使うことに。


time_t t = time(NULL);
_write(1, &t, sizeof(t));


まあ、たまにはこんな日もあるか・・