• ベストアンサー

fopen関数

いまいちfopen関数の使い方がわかりません。 FILE *fp; fp = fopen("test.txt","W"); fcose(fp); ですが、なぜここでポインタが出てくるんでしょうか? メモリ上に領域fpを作って、そこに関数のアドレスを格納している? と一応解釈していますがあっていますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.6

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つ」なので、ポインタで扱い、ライブラリ関数を呼ぶ時は「関数にポインタを渡して、ポインタが指す先の実体を、呼んだ先の関数の中で操作してもらう必要」があります。

szatmari
質問者

お礼

回答ありがとうございます。

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

たぶん ・昔の C の仕様として「構造体を値で返す関数」が作れなかった ・ポインタの方が小さい ・ポインタを使えばプログラムで一意に決めることができる などが組み合わさった結果ではないかなぁ.

szatmari
質問者

お礼

回答ありがとうございます。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

ファイル制御はC言語上ではどの関数を使って、 どういうことができればいいかが決まっているだけで、 その中身を決定しているわけでは有りません。 ファイル識別子であるファイルポインタの内容が ただの数値であるか、構造体であるか実装方法は 環境依存なわけですが、その中身が何であろうと それを関数に渡して使えばファイル系の関数が 使えるように実装されています。 > ですが、なぜここでポインタが出てくるんでしょうか? 中身を意識させないというのもあると思いますし、 fopenのように値を引数で返すようになっていない関数では 構造体は返せないし、構造体なのか整数なのか、 その実装方法によってエラー処理の書き方が 特定できなくなってしまいます。 ポインタにすれば、少なくともエラー処理は規定できるし、 中身が構造体であろうと、数値であろうと関係ないので、 そういう実装になっているのではないかと思われます。 #多くの処理系がそう実装しているのは規定されているからだと #思いますがなぜそういう実装にしたのかはC言語を #考えた人しかわからないかと。。。

szatmari
質問者

お礼

回答ありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> オブジェクト型ですがどういうことでしょうか? (サイズを決定できる)オブジェクトを表現するための型です。 具体的には、算術型(汎整数型、浮動小数点型)、ポインタ型、集成体型(配列型、構造体型)、共用体型が含まれます。

szatmari
質問者

お礼

回答ありがとうございます。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.3

fp = fopen("test.txt","W"); 小文字ですよ "w"

szatmari
質問者

お礼

回答ありがとうございます、 おおっと、これは失礼!

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

間違っています。 FILE型は、構造体とは限りませんが、オブジェクト型であることが規格で要求されています。関数のアドレスではありません。

szatmari
質問者

お礼

回答ありがとうごいます。 オブジェクト型ですがどういうことでしょうか? 手持ちのCの書籍をみてもそのような単語はありませんでした。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

関数のアドレスではなくて FILE という構造体の アドレスです。 FILEの定義はstdio.hにありますので参考にして下 さい。 簡単に書くと、fopenの情報のファイル名やリードか ライトかなどのデータや、ファイルのどこまでカレン トが進んだか、などのファイルアクセスに関する必要 なデータ領域を確保してそのポインタを返している訳 です。

szatmari
質問者

お礼

回答ありがございます。 格納するのは構造体のアドレスなのですね。

関連するQ&A