FILE構造体 – プログラミング – Home

通知
すべてクリア

[解決済] FILE構造体


ファイラー
 ファイラー
(@ファイラー)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

VC6 で開発しています。

fread();を使う箇所があるのですが、失敗することがあります。
この時なにが問題なのか調べたいのです。
FILE構造体で
char _flag というのがありますが、
リードエラーのとき137→153となります。

その他に問題があるかもしれませんが、それがわからないので
意味をしりたいです。

この意味を調べたいのですが、MSDNでみつけられず、
WEBでもみつけられません。

どなたか教えてください。


引用未解決
トピックタグ
Hazard52
 Hazard52
(@Hazard52)
ゲスト
結合: 20年前
投稿: 9
 

エラーが発生した時に、errno に値は設定されていないのでしょうか?


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

FILE 構造体の中身を知ろうとしてはいけません。それは隠蔽されたものとして扱うべき
ものです。
エラー情報は別の手段で取得しましょう。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

aetosさんと同じような話になってしまいますが、

FILE構造体に関しては、標準ライブラリが内部で処理するために
使っている情報です。
これは内部情報なので非公開情報になります。

「FILE 構造体の中身を知ろうとしてはいけません。」
と言うのは極端かなと思いますけれど、
知った所で意味が無いと言うのが正確かと思います。
内部情報に関しては現時点の内容がわかったとしても
ライブラリ側の都合で変更されてしまうケースがあります。
つまり、変えてしまう事もありえる物なので非公開なわけです。
そういう情報のある時点の状態を知った所で先々まで保証されて
いるわけではないのであまり意味が有りません。
逆に先々まで内容を保証しており、
変更する必要がある場合は、きちんとアナウンスされる公開情報だけを
使うとこの部分の心配がなくなります。

知識としての興味であれば良いのですが、
こういった非公開情報に頼ってしまうと思わぬ落とし穴にハマル事があります。
非公開情報はアナウンス無しに内容が変更されることがあると言うことを
頭においておくべきです。

なので、エラーに関しては正規の手段で取得して判定しましょう。


返信引用
ファイラー
 ファイラー
(@ファイラー)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

回答ありがとうございます。了解しました。
errno ですが、2(no such file or directory)でした。

しかし、この部分の処理は

fp = fopen();

for(条件){

fread(fp....);
fread(fp....); ←ここ
fread(fp....);
}

となっていて ここ の部分ででます。直前のreadは成功している?
(確認はできていません)ようなのです。

200回ぐらいのループで、120回で失敗します。よろしくお願いします。


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

>(確認はできていません)ようなのです。
なら全ての処理にエラー確認できる行を追加してみる。
(printfやOutputDebugStringなど)


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

1:
>fread();を使う箇所があるのですが、失敗することがあります。
失敗とはどんな状態になるのですか?
エラーダイアログがでて止まる、読み込んだデータがおかしい・・・などなど

2:
直前のfreadの成功が確認できないのに、
どうやって「120回目のここ」と場所がわかったのでしょうか?

3:
>errno ですが、2(no such file or directory)でした。
どのタイミングでこの変数を確認しましたか?

120回というところから、読み込み量が多すぎて
バッファ超えして、fpをぶっ壊してるとかじゃないかなと、予想


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーーん、
動作環境が書いてないので分かりませんねぇ

WINXPかVISTAでダイアログかSDIかMDIと言う仮定で進めると、

1.まず、「fread」の関数自体動作が不安定の可能性がありますね。

2.「fread」で200回も連続で読込むのが無茶なのかもしれませんね。

対策としてあくまでも案ですが、
 1.間にSleep(100);位入れてみるとかしてみるのも手かもしれませんね。
 2.後々は、関数に「WriteFile」等のWin32系のを使うのがいいと思います。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

修正です
> 2.後々は、関数に「WriteFile」等のWin32系のを使うのがいいと思います。
「fread」 に対しては 「ReadFile」ですね。


返信引用
ファイラー
 ファイラー
(@ファイラー)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

>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を使用していません。コンパイラだけです。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

ライブラリの実装詳細について知りたいのであれば情報提供はできるが
そんなライブラリの実装詳細について本当に知りたいの?
fread がバグっている可能性は 1ppb 以下だと思う。
知りたいのは自分のソースコードのどこがバグっているのか、ではないの?

fread を誤った使い方して、変数をぶっ壊している、に1票
fread の使い方を誤解していて真に EOF に達しているに1票


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

正常にEOFに達した時はerrnoは0になっていたから、私は
> fread を誤った使い方して、変数をぶっ壊している、
だけに1票


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

>freadの戻り値は毎回チェックしています。
僕なら

if ( fread(pbuf,1,sizeof(aa),fpr) != sizeof(aa) ){
// error
}
と書くかな。

もうちょっと全体像が分かるソースを載せた方が早いかも。


返信引用
ファイラー
 ファイラー
(@ファイラー)
ゲスト
結合: 22年前
投稿: 6
Topic starter  

皆様 すみません。
ご指摘どおり、ファイルポインタの操作間違いがありました。
簡単に報告すると違うファイルのファイルポインタを操作していたところが
ありました。

ごめんなさい。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました