- ベストアンサー
fopen関数
いまいちfopen関数の使い方がわかりません。 FILE *fp; fp = fopen("test.txt","W"); fcose(fp); ですが、なぜここでポインタが出てくるんでしょうか? メモリ上に領域fpを作って、そこに関数のアドレスを格納している? と一応解釈していますがあっていますか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
fopenは「ファイル記述子のポインタ」を返します。 ファイル記述子関連は、通常、Cコンパイラでは、以下のように実装されています(C++では、クラスオブジェクトで実装されているので、以下とは異なる) #define FOPEN_MAX ??? //最大数は処理系により異なる typedef struct { 略 //構造体メンバは処理系により異なる } FILE; //同時に何個もファイルを開く場合があるので、配列になっている //配列の実体はライブラリにあるので、外部参照で宣言されている extern FILE _streams[FOPEN_MAX]; //配列の名前は処理系により異なる #define stdin (&_streams[0]) //main関数に来る前にオープン済みになっている #define stdout (&_streams[1]) //main関数に来る前にオープン済みになっている #define stderr (&_streams[2]) //main関数に来る前にオープン済みになっている このように、どこかに「有限個の配列」があって、fopenはファイルをオープンすると未使用の要素を探し、使用済みに変更してから「配列の要素のどれか1つのポインタ」を返してきます。 通常、要素の0~2番目は、stdin、stdout、stderrが使っているので、最初にオープンしたファイルは(0から数えて)3番目の要素のポインタを返して来ます。 (処理系によってはstdaux、stdprnがあるので、0から数えて5番目の場合もある) このように、ファイル記述子の実体は「どこかにある配列の1つ」なので、ポインタで扱い、ライブラリ関数を呼ぶ時は「関数にポインタを渡して、ポインタが指す先の実体を、呼んだ先の関数の中で操作してもらう必要」があります。
その他の回答 (6)
- Tacosan
- ベストアンサー率23% (3656/15482)
たぶん ・昔の C の仕様として「構造体を値で返す関数」が作れなかった ・ポインタの方が小さい ・ポインタを使えばプログラムで一意に決めることができる などが組み合わさった結果ではないかなぁ.
お礼
回答ありがとうございます。
- aris-wiz
- ベストアンサー率38% (96/252)
ファイル制御はC言語上ではどの関数を使って、 どういうことができればいいかが決まっているだけで、 その中身を決定しているわけでは有りません。 ファイル識別子であるファイルポインタの内容が ただの数値であるか、構造体であるか実装方法は 環境依存なわけですが、その中身が何であろうと それを関数に渡して使えばファイル系の関数が 使えるように実装されています。 > ですが、なぜここでポインタが出てくるんでしょうか? 中身を意識させないというのもあると思いますし、 fopenのように値を引数で返すようになっていない関数では 構造体は返せないし、構造体なのか整数なのか、 その実装方法によってエラー処理の書き方が 特定できなくなってしまいます。 ポインタにすれば、少なくともエラー処理は規定できるし、 中身が構造体であろうと、数値であろうと関係ないので、 そういう実装になっているのではないかと思われます。 #多くの処理系がそう実装しているのは規定されているからだと #思いますがなぜそういう実装にしたのかはC言語を #考えた人しかわからないかと。。。
お礼
回答ありがとうございます。
- jacta
- ベストアンサー率26% (845/3158)
> オブジェクト型ですがどういうことでしょうか? (サイズを決定できる)オブジェクトを表現するための型です。 具体的には、算術型(汎整数型、浮動小数点型)、ポインタ型、集成体型(配列型、構造体型)、共用体型が含まれます。
お礼
回答ありがとうございます。
- eroermine
- ベストアンサー率18% (83/444)
fp = fopen("test.txt","W"); 小文字ですよ "w"
お礼
回答ありがとうございます、 おおっと、これは失礼!
- jacta
- ベストアンサー率26% (845/3158)
間違っています。 FILE型は、構造体とは限りませんが、オブジェクト型であることが規格で要求されています。関数のアドレスではありません。
お礼
回答ありがとうごいます。 オブジェクト型ですがどういうことでしょうか? 手持ちのCの書籍をみてもそのような単語はありませんでした。
- Tasuke22
- ベストアンサー率33% (1799/5383)
関数のアドレスではなくて FILE という構造体の アドレスです。 FILEの定義はstdio.hにありますので参考にして下 さい。 簡単に書くと、fopenの情報のファイル名やリードか ライトかなどのデータや、ファイルのどこまでカレン トが進んだか、などのファイルアクセスに関する必要 なデータ領域を確保してそのポインタを返している訳 です。
お礼
回答ありがございます。 格納するのは構造体のアドレスなのですね。
お礼
回答ありがとうございます。