web-dev-qa-db-fra.com

Quel est exactement le mot clé de fichier en C?

J'ai commencé à apprendre des C comme un passe-temps et j'ai utilisé aveuglément utilisé comme une déclaration pour les pointeurs de fichiers pendant un certain temps, et je me suis demandé. Est-ce un mot clé ou un type de données spécial pour C pour gérer des fichiers avec? Contient-il un flux dans le fichier dans et d'autres données? Pourquoi est-il défini comme un pointeur?

Un exemple pour montrer ce que je veux en faire un peu plus clair:

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

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

est-ce un mot clé ou un type de données spécial pour C pour gérer des fichiers avec?

Ce que vous faites référence est une structure Typedef'D utilisée par la bibliothèque IO standard pour contenir les données appropriées pour l'utilisation de Fopen et sa famille de fonctions.

Pourquoi est-il défini comme un pointeur?

Avec un pointeur à une structure, vous pouvez ensuite le transmettre en tant que paramètre à une fonction. Ceci est par exemple ce que les Fgets ou FgetC accepteront, sous la forme de function(FILE* fp)

La fonction Fopen retournera un pointeur sur une structure de fichiers nouvellement créée, attribuant ce nouveau pointeur à votre inutilisé, on leur fera pousser à la même chose.

Contient-il un flux dans le fichier dans et d'autres données?

La définition de la structure semble un peu plus illusoire que sa description. Ceci est directement pris de mon stdio.h, de Mingw32 5.1.4

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

Qui comprend le charmant commentaire avant de:

Certains croient que personne dans leur bon esprit ne devrait utiliser les internes de cette structure.

Le contenu de cette structure semble changer considérablement sur d'autres implémentations, les sources GLIBC ont généralement une forme de commentaire, mais leur structure pour cela est considérée comme beaucoup de code.

Il serait logique de tenir compte de l'avertissement susmentionné et de ne pas vous inquiéter de ce que cela fait. :)

35
Alexander

FILE est un identifiant utilisé comme nom TypeDEF, généralement pour un struct. La bibliothèque de Stdio a généralement quelque chose comme

typedef struct {
   ...
} FILE;

quelque part. Toutes les fonctions STDIO traitant des pointeurs de fichiers connaissent la suite de ... et peut accéder aux membres de la structure. Les programmeurs C doivent utiliser des fonctions telles que fopen, feof, ferror, ungetcc pour créer et utiliser des structures de fichiers. Ces types sont appelés opaque (c'est-à-dire que vous ne pouvez pas jeter d'aînée à l'intérieur d'eux mais devez utiliser les fonctions d'accesseur).

Pourquoi est-il défini comme un pointeur?

Ce n'est pas le cas. C'est une structure à laquelle votre code déclare un pointeur. Notez l'astérisque dans votre

FILE* fp;

quel est un autre exemple de la raison pour laquelle l'astérisque devrait aller avec l'identifiant de variable, pas le nom de type:

FILE *fp;
9
Jens

C'est un type de données spécial. Il contient une poignée de fichier ainsi que divers drapeaux utilisés en interne par les différents appels Stdio. Vous n'avez jamais besoin de savoir en réalité ce qu'il y a, c'est-à-dire qu'il s'agit d'un type de données que vous pouvez transmettre.

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

Cependant, si vous êtes intéressé, voici ce à quoi cela ressemble:

http://fr.allexperts.com/q/c-1587/2008/5/file-tructure.htm

0
Chris Eberle