VC6 で開発しています。
fread();を使う箇所があるのですが、失敗することがあります。
この時なにが問題なのか調べたいのです。
FILE構造体で
char _flag というのがありますが、
リードエラーのとき137→153となります。
その他に問題があるかもしれませんが、それがわからないので
意味をしりたいです。
この意味を調べたいのですが、MSDNでみつけられず、
WEBでもみつけられません。
どなたか教えてください。
エラーが発生した時に、errno に値は設定されていないのでしょうか?
FILE 構造体の中身を知ろうとしてはいけません。それは隠蔽されたものとして扱うべき
ものです。
エラー情報は別の手段で取得しましょう。
aetosさんと同じような話になってしまいますが、
FILE構造体に関しては、標準ライブラリが内部で処理するために
使っている情報です。
これは内部情報なので非公開情報になります。
「FILE 構造体の中身を知ろうとしてはいけません。」
と言うのは極端かなと思いますけれど、
知った所で意味が無いと言うのが正確かと思います。
内部情報に関しては現時点の内容がわかったとしても
ライブラリ側の都合で変更されてしまうケースがあります。
つまり、変えてしまう事もありえる物なので非公開なわけです。
そういう情報のある時点の状態を知った所で先々まで保証されて
いるわけではないのであまり意味が有りません。
逆に先々まで内容を保証しており、
変更する必要がある場合は、きちんとアナウンスされる公開情報だけを
使うとこの部分の心配がなくなります。
知識としての興味であれば良いのですが、
こういった非公開情報に頼ってしまうと思わぬ落とし穴にハマル事があります。
非公開情報はアナウンス無しに内容が変更されることがあると言うことを
頭においておくべきです。
なので、エラーに関しては正規の手段で取得して判定しましょう。
回答ありがとうございます。了解しました。
errno ですが、2(no such file or directory)でした。
しかし、この部分の処理は
fp = fopen();
for(条件){
fread(fp....);
fread(fp....); ←ここ
fread(fp....);
}
となっていて ここ の部分ででます。直前のreadは成功している?
(確認はできていません)ようなのです。
200回ぐらいのループで、120回で失敗します。よろしくお願いします。
>(確認はできていません)ようなのです。
なら全ての処理にエラー確認できる行を追加してみる。
(printfやOutputDebugStringなど)
1:
>fread();を使う箇所があるのですが、失敗することがあります。
失敗とはどんな状態になるのですか?
エラーダイアログがでて止まる、読み込んだデータがおかしい・・・などなど
2:
直前のfreadの成功が確認できないのに、
どうやって「120回目のここ」と場所がわかったのでしょうか?
3:
>errno ですが、2(no such file or directory)でした。
どのタイミングでこの変数を確認しましたか?
120回というところから、読み込み量が多すぎて
バッファ超えして、fpをぶっ壊してるとかじゃないかなと、予想
うーーん、
動作環境が書いてないので分かりませんねぇ
WINXPかVISTAでダイアログかSDIかMDIと言う仮定で進めると、
1.まず、「fread」の関数自体動作が不安定の可能性がありますね。
2.「fread」で200回も連続で読込むのが無茶なのかもしれませんね。
対策としてあくまでも案ですが、
1.間にSleep(100);位入れてみるとかしてみるのも手かもしれませんね。
2.後々は、関数に「WriteFile」等のWin32系のを使うのがいいと思います。
修正です
> 2.後々は、関数に「WriteFile」等のWin32系のを使うのがいいと思います。
「fread」 に対しては 「ReadFile」ですね。
>fread();を使う箇所があるのですが、失敗することがあります。
>失敗とはどんな状態になるのですか?
>エラーダイアログがでて止まる、読み込んだデータがおかしい・・・などなど
freadの戻り値は毎回チェックしています。
if(fread( pbuf , sizeof(aa), 1, fpr ) < 1 ){
// error
}
>直前のfreadの成功が確認できないのに、
>どうやって「120回目のここ」と場所がわかったのでしょうか?
上記の通り戻り値で判断しています。
>errno ですが、2(no such file or directory)でした。
>どのタイミングでこの変数を確認しましたか?
freadのエラーがでてすぐ確認しました。
> WINXPかVISTAでダイアログかSDIかMDIと言う仮定で進めると、
実はコンソールアプリでmfcを使用していません。コンパイラだけです。
ライブラリの実装詳細について知りたいのであれば情報提供はできるが
そんなライブラリの実装詳細について本当に知りたいの?
fread がバグっている可能性は 1ppb 以下だと思う。
知りたいのは自分のソースコードのどこがバグっているのか、ではないの?
fread を誤った使い方して、変数をぶっ壊している、に1票
fread の使い方を誤解していて真に EOF に達しているに1票
正常にEOFに達した時はerrnoは0になっていたから、私は
> fread を誤った使い方して、変数をぶっ壊している、
だけに1票
>freadの戻り値は毎回チェックしています。
僕なら
if ( fread(pbuf,1,sizeof(aa),fpr) != sizeof(aa) ){
// error
}
と書くかな。
もうちょっと全体像が分かるソースを載せた方が早いかも。
皆様 すみません。
ご指摘どおり、ファイルポインタの操作間違いがありました。
簡単に報告すると違うファイルのファイルポインタを操作していたところが
ありました。
ごめんなさい。