2009-09-03 7 views
3

Je venais de regarder au stdio.h où je pourrais trouver la définition structure FILE :Création de son propre pointeur FILE * en C?

typedef struct { 
    int    level;  /* fill/empty level of buffer */ 
    unsigned  flags;  /* File status flags   */ 
    char   fd;   /* File descriptor   */ 
    unsigned char hold;  /* Ungetc char if no buffer */ 
    int    bsize;  /* Buffer size    */ 
    unsigned char *buffer; /* Data transfer buffer  */ 
    unsigned char *curp;  /* Current active pointer  */ 
    unsigned  istemp;  /* Temporary file indicator */ 
    short   token;  /* Used for validity checking */ 
} FILE; 

Maintenant, je me demande si je pouvais me créer (ne pas utiliser fopen) un pointeur de fichier valide à un flux que je pourrais utiliser ensuite dans les appels ultérieurs pour fread ou fwrite? C'est plus une question théorique donc s'il vous plaît ne vous demandez pas pourquoi je veux savoir que;)

De plus, est-il exact que stdio ne fournit pas une routine pour supprimer un fichier? Dans ce cas, j'ai besoin d'appels OS, n'est-ce pas?

Merci

Répondre

0

En fonction de l'implémentation de la bibliothèque standard, il peut être possible de créer votre propre structure FILE et de l'utiliser. Cependant, ceci est complètement non supporté, peut ou ne peut pas réellement fonctionner comme prévu, et ne sera certainement pas portable entre différentes implémentations de bibliothèque.

Pour supprimer un fichier, appelez le unlink(), qui est (sur mon système) dans <unistd.h>.

1

Le contenu et la signification de FILE sont indéfinis. Différents compilateurs/bibliothèques, et différentes versions du même compilateur/bibliothèque peuvent avoir un contenu complètement différent, ou même juste des changements subtils mais cassants. FILE est un bloc de données opaque qui permet aux différentes fonctions de la bibliothèque de partager l'état.

Il s'agit du et non du conçu pour être séparé et réutilisé par le code utilisateur.

OTOH il n'y a rien pour vous arrêter, à part le fait que toute solution basée sur ce sera fragile (au mieux).

5

Non, vous ne devriez même pas essayer cela car ce n'est pas portable. La spécification C99 indique que vous ne devriez même pas essayer de copier un objet existant FILE car son adresse 'peut être significative'. Stdio fournit remove() pour supprimer un fichier.

+0

Merci pour la réponse! Sur mon stdio lib porté, il n'y a pas de fonction remove() définie. –

+1

C'est étrange parce que AFAICS 'remove()' est même défini dans ANSI C spec. –

+0

En effet, c'est. James01, votre bibliothèque n'est pas conforme à la norme. – DevSolar

3

Même si vous connaissez parfaitement votre bibliothèque: Un composant de chaque structure FILE est le "descripteur de fichier", généralement un entier. C'est ainsi que le noyau identifie le flux.

Votre bibliothèque ne peut pas accéder au système de fichiers lui-même, elle doit s'appuyer sur les appels système au noyau. Ces appels système n'utilisent pas la structure FILE pour identifier un flux, mais simplement le "descripteur de fichier" de celui-ci.

Sur un système POSIX, vous obtenez ce descripteur de fichier à partir de l'appel open (2).

Il est possible d'obtenir ce descripteur de fichier, et initialiser la structure de fichier vous-même, si vous connaissez les exigences de bibliothèque bien (et toutes les bibliothèques, même toutes les bibliothèques la version, peut varier considérablement dans ces conditions).

Mais alors, vous n'avez rien fait de différent que fopen() pour vous - seulement fopen() est plus confortable.

Pour supprimer un fichier, utilisez remove().

1

Sur BSD, vous pouvez utiliser funopen or fropen/fwopen pour créer un FILE* avec des fonctions de rappel personnalisées pour les E/S.

Sous Linux, une fonction similaire est fopencookie.

Non que ce soit portable ou recommandé, mais c'est une façon de créer des pointeurs FILE valides sans utiliser fopen.

Pour l'élimination du fichier, il y a remove et unlink souligné par d'autres contributeurs.

Questions connexes