久しぶりにWindowsでハマる

UNIX育ちの人間には信じられないようなレベルの罠があったのでメモしとく。
Windowsでftell()/fseek()等をする時はfopen()を"b"で呼んだ場合しかまともに動かない。つまり"t"で開いたら、その時点でfseek()やftell()などは全く使い物にならないということ。vc6とmingwのどちらでも同様。ちなみにcygwinでは問題無かった。いろいろ調べた結果、それが仕様ということのようだ。そもそもfseek()的なファイルアクセスは想定していないっぽい。
Win32APIではSetFilePointerとかいう感じの似たAPIがあるので、そっちに移行すれば良いのかもしれない(無根拠な希望的観測)のだが、Win32APIにはfscanf()に相当するAPIが無いので、とっても困るのだ。え、fscanf()は使っちゃダメだろうって?…ごめんなさい、便利さに負けて危険性を承知の上で使ってます。(注:見知らぬ他人に使わせるプログラムはfgets()使ってますよ。身内で使われる程度なら、入力データも出所がわかってるんだし、許してください…)

っつーか、そもそも"b"とか"t"って何だよ!俺だって"t"とかいう変なモードなんて使いたいねーよ。そういう変なことせざるを得ない謎なテキストフォーマットを作った張本人がMicrosoftだろうが!と愚痴の一つも言いたくなるトホホな仕様だ。