web-dev-qa-db-ja.com

CのFILEキーワードとは正確には何ですか?

私は趣味としていくつかのCを学び始め、かなり長い間、ファイルポインターの宣言として盲目的にFILEを使用してきました。これは、Cがファイルを処理するためのキーワードまたは特別なデータ型ですか?内のファイルへのストリームと他のデータが含まれていますか?ポインタとして定義されているのはなぜですか?

もう少し明確にするために私が何を意味するかを示す例:

FILE* fp; //<-- this
fp = fopen("datum.txt", "r");

while(!feof(fp)) {
   // etc.
}
24
johnholtsdater

これは、Cがファイルを処理するためのキーワードまたは特別なデータ型ですか?

あなたが参照しているのは、fopenの使用に適切なデータを保持するために標準ioライブラリとその関数ファミリーを保持するために使用されるtypedef構造です。

ポインタとして定義されているのはなぜですか?

構造体へのポインタを使用すると、構造体をパラメータとして関数に渡すことができます。これは、たとえば、f [gets]または[fgetc]がfunction(FILE* fp)の形式で受け入れるものです。

Fopen関数は、新しく作成されたFILE構造体へのポインターを返します。この新しいポインターを未使用のポインターに割り当てると、同じものを指すようになります。

内のファイルへのストリームと他のデータが含まれていますか?

構造の定義は、その説明よりも少し幻想的です。これは、MinGW32 5.1.4のstdio.hから直接取得されます。

typedef struct _iobuf
{
    char*   _ptr;
    int _cnt;
    char*   _base;
    int _flag;
    int _file;
    int _charbuf;
    int _bufsiz;
    char*   _tmpfname;
} FILE;

その前に素敵なコメントが含まれています:

一部の人々は、正しい構造の誰もこの構造の内部を利用するべきではないと信じています。

この構造の内容は他の実装では大きく変化するようです。glibcのソースには通常、なんらかの形式のコメントがありますが、そのための構造は多くのコードの下に埋め込まれています。

前述の警告に耳を傾け、それが何をするか心配しないことは理にかなっています。 :)

35
Alexander

FILEはtypedef名として使用される識別子で、通常はstructに使用されます。 stdioライブラリは通常次のようなものです

typedef struct {
   ...
} FILE;

どこかに。 FILEポインターを扱うすべてのstdio関数は、...の内容を認識しており、構造体のメンバーにアクセスできます。 Cプログラマーはfopenfeofferrorungetcなどの関数を使用してFILE構造体を作成および操作する必要があります。そのようなタイプは不透明と呼ばれます(つまり、それらの内部を覗くことはできませんが、アクセサ関数を使用する必要があります)。

ポインタとして定義されているのはなぜですか?

そうではありません。 yourコードがポインタを宣言する構造体です。のアスタリスクに注意してください

FILE* fp;

これは、アスタリスクが型名ではなく変数識別子を使用する理由のもう1つの例です。

FILE *fp;
9
Jens

これはキーワードではなく、ファイルを操作するためにANSI C標準で定義されているデータ型です。これは通常、ファイルとその現在の状態をライブラリー関数に記述する内部構造を指します。

3
littleadv

これは特別なデータ型です。これには、ファイルハンドルと、さまざまなstdio呼び出しによって内部的に使用されるさまざまなフラグが含まれます。何が入っているかを実際に知る必要は決してありません。ただ渡すことができるデータ型であることだけです。

http://www.cplusplus.com/reference/clibrary/cstdio/FILE/

ただし、興味がある場合は、次のようになります。

http://en.allexperts.com/q/C-1587/2008/5/FILE-Structure.htm

0
Chris Eberle