お久しぶりです。masat21です。
早速質問ですが、OSがWindows2000でコンパイラがVC++6.0の環境において、メディアファイルのアクセス処理について解析をしております。
ファイルオープン時に使用するfopen()で、FILE構造体のポインタが返されますが、この構造体の全てのメンバの意味を知るには何を参考にしたら良いのでしょうか?書籍でもURLのどちらでも構いません。
特に、_charbufと、_tmpfnameの意味が分かりません。
お手数ですが、知っている方がいましたら、至急回答願います。
よろしくお願いします。
以上
FILE* の中身はブラックボックスとして扱うべきです。
公開されているメンバ以外、知るべきではありません。
実質知ってよいのは fileno() マクロで取り出せるファイルハンドルだけです。
> 至急回答願います。
そんなこと書かれたって知らないです。
むしろ「至急」とか書かれたらわざと放置してどうなるか様子を見たくなります。
それに official な情報を知りたいのなら Microsoft に問い合わせるべきです。
Microsoft と無関係な掲示板の内容を 100% 信じるつもりですか?
> 至急回答願います。
..............。
FILE* の中身は実装依存なので、そんなもの調べて
何の意味があるのか分りませんけど、
CRT のソースを読むか、トレースで追いかけたらどうです?
なんというか…すでに結論は出ていますが。
includeされるファイルを片っ端から調べれば、どのようなメンバがあるか調べることは可能です。
が、どのみち実装依存ですし意味がありません。
Cの標準関数の仕様を調べたことはありませんが、
あくまでもポインタとしての使用しか想定されていないかと思われます。
ランタイムのバージョンが変わった際にメンバに直接アクセスしていると問題が出るかも知れません。
一応、UNIXの例ですが
http://www.comm.info.eng.osaka-cu.ac.jp/~sugi/vuniv98/C9.html
こんなページが。
「注意3」にも書かれていますが。
# 提供側からブラックボックスとして扱えと言われている以上
# 従うべきかと。
瀬戸っぷさん、回答をいただきありがとうございます。
確かにブラックボックスをホワイトボックスにすることはできないと思います。
目的は、現在ファイルでアクセスしているところを、メモリに置き換えるために、変更前における最低限の情報を得たかったからです。
上記の情報を変更前の処理として記述し、メモリに置き換える実現方式については変更後の処理として記述しようと考えたからです。
ブラックボックスの箇所については、推測で書くしかないのかもしれませんね!
残念!
ファイルからメモリへ変更などで内部の実装を意識させないためにも、
わざわざFILE* は抽象化されたインターフェイスとして設計されています。
そのために内部情報はブラックボックスになっているわけですが、
変に中身を推測とかいうのは、そもそも発想にズレがありませんか。
上記が目的であれば、内部情報ではなくFILE に対して制御を行っている
操作(例えばfopen の引数等)の方から情報を引くのが妥当だと思います。
> CRT のソースを読むか、トレースで追いかけたらどうです?
ちなみに、VC6でCRTとかトレースすると、ソースの中に例えばこんなのとか
あるわけですが、どうも試してももらえなかったみたいですね....。
/* Cannot allocate buffer. Use _charbuf this time */
stream->_ptr = stream->_base = (void *)&(stream->_charbuf);
stream->_cnt = stream->_bufsiz = 2;
ツイート | ![]() |