Ouverture de fichiers

Ouverture de fichiers - C - Programmation

Marsh Posté le 13-04-2010 à 10:24:43    

Bonjour tous :)
 
Pouvez vous me commenter ce code car sur un site il y avait ce commentaire et c'est pas bien expliqué ( c'est pluton embrouillant) :
 

Code :
  1. FILE* fopen(const char* nomDuFichier, const char* modeOuverture);
  2. /*Cette fonction renvoie un pointeur sur une structure de type FILE. Cette structure est définie dans stdio.h.
  3. */
  4. int main(void)
  5. {
  6.     FILE* fichier = NULL;
  7.     fichier = fopen("test.txt", "r+" ); /*Le pointeur "fichier" devient alors un pointeur sur "test.txt".*/
  8. /*Le pointeur "fichier" devrait contenir l'adresse de la structure de type FILE qui sert de descripteur de fichier*/
  9. return 0;
  10. }


Reply

Marsh Posté le 13-04-2010 à 10:24:43   

Reply

Marsh Posté le 13-04-2010 à 10:53:22    

Salut

 

La structure FILE te permet de manipuler les fichiers. Toutes les fonctions qui permettent d'ouvrir un fichier, de lire, écrire dedans puis de le refermer l'utilisent.
Cependant tu n'auras jamais besoin de connaître les champs de cette structure: un pointeur te suffit.
Avec fopen tu ouvres le fichier et tu obtiens un pointeur vers une structure FILE que tu dois conserver jusqu'à l'appel à fclose.
Après un appel à fopen, tu dois vérifier que ton pointeur soit valide

Code :
  1. FILE* f;
  2. f = fopen("fichier", "r" );
  3. if (f == NULL)
  4.      printf("Erreur ouverture\n" );


Ensuite tu peux utiliser ce pointeur pour lire le fichier par exemple.

Code :
  1. char buffer[200];
  2. fgets(buffer, 200, f);


Message édité par ptitchep le 13-04-2010 à 10:56:26

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 13-04-2010 à 11:01:39    

Ce que je comprenCe que je comprend pas c'est qu'ils disent Le pointeur "fichier" devient alors un pointeur sur "test.txt et Le pointeur "fichier" devrait contenir l'adresse de la structure de type FILE.. c'est contradictoire non?

Reply

Marsh Posté le 13-04-2010 à 11:06:12    

lassault1 a écrit :

Ce que je comprenCe que je comprend pas c'est qu'ils disent Le pointeur "fichier" devient alors un pointeur sur "test.txt et Le pointeur "fichier" devrait contenir l'adresse de la structure de type FILE.. c'est contradictoire non?


 
 
Non c'est la première phrase qui est un raccourci.
 
fichier est bien une variable contenant l'adresse d'une structure de type FILE qui permet de manipuler ton fichier via les fonctions fopen / close / fwrite / fread / fprintf / etc...
 
 
Ce n'est pas directement un pointeur vers le fichier, ce qui n'a pas de sens, un pointeur est une variable qui stocke une adresse mémoire, or, ici il s'agit d'un fichier.

Reply

Marsh Posté le 13-04-2010 à 11:26:12    

Si je comprend bien fichier est un pointeur contenant l'adresse d'une structure de type FILE ( c'est le retour de la fonction) mais ce n'est pas un pointeur sur la structure de type FILE car la déclaration serait comme par exemple :
 
FILE* fichier = &dossier;
 
C'est ça ou pas?

Reply

Marsh Posté le 13-04-2010 à 11:41:51    

Dire qu'un pointeur contient l'adresse d'une structure FILE ou dire qu'il pointe sur une structure de type FILE revient au même.

 

On peut déclarer un pointeur sans l'initialiser comme n'importe quelle variable.
FILE *f;

 

ensuite tu peux affecter une adresse à un pointeur de différentes façons.
Par exemple en lui donnant directement l'adresse d'une variable:
int a;
int *p;
p=&a

 

Mais tu peux aussi lui affecter une adresse qui t'est donnée par une fonction par exemple.
int* fonctionQuiRetourneUneAdresse();
int *p;
p = fonctionQuiRetourneUneAdresse();

 

C'est le cas de fopen. fopen fait sa tambouille dans son coin et ouvre le fichier puis stocke les données nécessaires à sa manipulation dans une structure de type FILE. Ensuite il te retourne l'adresse de cette structure.

 

Est-ce que ça répond à ta question?


Message édité par ptitchep le 13-04-2010 à 11:42:37

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 13-04-2010 à 11:53:31    

Oui merci c'est exactement ça..
 
Il reste une question :  
 
Pourquoi il est dit que le pointeur "fichier" devient alors un pointeur sur "test.txt" ?

Reply

Marsh Posté le 13-04-2010 à 11:56:52    

lassault1 a écrit :

Oui merci c'est exactement ça..
 
Il reste une question :  
 
Pourquoi il est dit que le pointeur "fichier" devient alors un pointeur sur "test.txt" ?


 
C'est un raccourci pour "pointeur sur une structure FILE decrivant le fichier nomme test.txt.  (ta source n'est pas
d'une qualite pedagogique exceptionnelle).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 13-04-2010 à 12:08:23    

Un Programmeur a écrit :

 

ta source n'est pas d'une qualite pedagogique exceptionnelle.

 

Oui j'ai vu ça.. pouvez vous reprendre le code et faire les mêmes commentaires plus simple pour débutant comme ça je pourrais le schématiser dans ma tite tête...

 

Autre questions :

 

1/ Est ce que la structure FILE a une variable nommé "fichier" de type FILE ? ( je me pose la question car le pointeur sur FILE se nomme "fichier" )

 

2/ Est ce que "test.txt" et "w" sont des chaines de caractère? si oui, pourquoi "w" est une chaine alors qu'il contient qu'un caractère "w" ?


Message édité par lassault1 le 13-04-2010 à 13:48:45
Reply

Marsh Posté le 13-04-2010 à 14:44:56    

lassault1 a écrit :

Bonjour tous :)
 
Pouvez vous me commenter ce code car sur un site il y avait ce commentaire et c'est pas bien expliqué ( c'est pluton embrouillant) :
 


 
Bon pour schématiser les choses:
En C, pour représenter un fichier, on passe par un objet FILE. Et de fait, on n'y accède qu'a travers un pointeur, un FILE*, sans savoir quels sont les champs internes à l'objet FILE. C'est ce qu'on appèle un objet opaque. Comment en réalité cet objet est en relation avec le fichier est quelque chose dont le programmeur C n'a pas a se préoccuper (c'est complexe, ça dépend de l'OS, bref, FILE a été créé justement pour cacher toute le complexité et ne voir que quelque chose de simple, et c'est pour cela que l'objet est opaque). Ceux que ça peut intéresser, ce sont ceux qui portent les librairies C sur un nouvel OS, ceux qui codent un nouvel OS, etc. Bref, pas le programmeur C de base.
 
Donc à retenir: Un fichier est représenté en C par un objet FILE, qu'on ne manipule qu'a travers un pointeur, un FILE*, sans avoir besoin d'en savoir plus sur comment ça se passe en interne.
 

Code :
  1. int main(void)
  2. {
  3.     // On va manipuler un fichier, donc on va avoir une entité de type FILE qui va le représenter, et  
  4.     // à laquelle on ne va accéder qu'a travers un pointeur.
  5.     // On crée donc une variable qui va nous permettre d'accéder a l'entité de type FILE qui va représenter
  6.     // le fichier. On va choisir un nom de variable significatif plutôt que toto...
  7.     FILE* fichier = NULL;
  8.     // On utilise fopen pour effectivement associer notre variable a un fichier concret.
  9.     // Si ça ne se produit pas (fichier inexistant, pas les bon droits...) la fonction retourne avec NULL
  10.     fichier = fopen("test.txt", "r+" ); /*Le pointeur "fichier" devient alors un pointeur sur "test.txt".*/
  11.     if (fichier) {  // L'association a été bien réalisée
  12.       // On manipule le fichier qu'on a ouvert, et pour ce faire donc, on passe par le pointeur sur  
  13.       // l'entité de type FILE qui représente le fichier. Par exemple avec fread ou fwrite
  14.       // On ferme un fichier qu'on a ouvert, et pour ce faire donc, on passe par le pointeur sur  
  15.       // l'entité de type FILE qui représente le fichier
  16.       fclose(fichier);
  17.     }
  18.    
  19. return 0;
  20. }


Toutes les fonctions de manipulation de fichier utilisent le pointeur sur l'entité de type FILE qui représente le fichier comme argument.
Donc après l'avoir obtenu avec fopen, on a juste a le fournir a ces fonctions, sans se poser de question:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
int fflush(FILE *stream);
int fprintf(FILE *stream, const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
etc etc etc
 
Cas particulier: il y a 3 FILE* qui sont prédéfinis, et qu'on n'a jamais besoin d'ouvrir ou fermer, c'est stdin, stdout et stderr
On peut les utiliser dans les fonctions précédentes, comme tout autre FILE*, mais il existe aussi des fonction prédéfinies qui les utilisent systématiquement, sans qu'il y ait besoin de préciser quoi que ce soit:
faire printf(const char *format, ...) ça revient à faire fprintf(stdout, const char *format, ...)
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2010 à 14:44:56   

Reply

Marsh Posté le 13-04-2010 à 14:55:34    

Citation :

1/ Est ce que la structure FILE a une variable nommé "fichier" de type FILE ? ( je me pose la question car le pointeur sur FILE se nomme "fichier" )

La structure de type FILE, en C, on sait rien dessus, on ne sait pas ce qu'elle contient, et on n'a pas besoin de le savoir.
C'est juste un objet qu'on peut associer/dissocier a un fichier du HDD a travers un appel à fopen/fclose.

 

Dans ton exemple, le pointeur sur FILE se nomme "fichier", mais on pourrait aussi le nommer "schmurglx", simplement, ce que la variable représente serait moins clair à la lecture.

Citation :


2/ Est ce que "test.txt" et "w" sont des chaines de caractère? si oui, pourquoi "w" est une chaine alors qu'il contient qu'un caractère "w" ?

Oui, c'est une chaine (donc deux caractères, 'w' et '\0'). Parce que ça pourrait aussi être une chaine plus longue, comme "w+".
(et une fonction a qui on dit qu'un paramètre est un caractère, elle lit juste un caractère, alors qu'une fonction a qui on dit qui on dit qu'un paramètre est une chaine, elle lit tous les caractères jusqu'à ce qu'elle rencontre '\0').
A+,

 


Message édité par gilou le 13-04-2010 à 14:55:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2010 à 17:23:41    

Merci a vous..
 
Il y a un truc que je comprends pas c'est qu'on envoie "test.txt" a la fonction et cette fonction envoie "test.txt" a la structure FILE... d'abord c'est c'est ça?  si oui comme la fonction fait elle?

Reply

Marsh Posté le 13-04-2010 à 23:38:02    

La structure FILE n'est qu'une zone mémoire dans laquelle sont entreposées des données. Ces données permettent de gérer un fichier dans l'arborescence du système. Le comment dépend du système il n'est donc pas possible de te donner une réponse toujours juste.
Perso je code en C depuis quelques années déjà et je n'ai jamais poussé plus loin car je n'y vois aucune utilité. Tu vas tomber sur des choses très bas niveau sur la gestion des fichiers de ton système dont tu n'as à priori pas besoin. C'est un peu comme printf. Comment printf affiche-t-il quelque chose à l'écran? Est-ce vraiment nécessaire de le savoir?  
 
La fonction fopen n'envoie pas "test.txt" à la structure FILE car la structure n'est qu'un morceau de mémoire dans lequel on peut écrire des données. Elle utilise les fonctionnalités de ton système d'exploitation pour avoir accès au système de fichiers. Les informations nécessaires à cet accès sont fournis par l'OS et sont stockées en mémoire (dans une structure de type FILE) afin de permettre facilement de futurs opérations.
 
Donc pour résumer, fopen reçoit un nom de fichier et s'occupe de tout le reste pour qu'ensuite tu puisses effectuer toutes les opérations que tu souhaites (si tu en as le droit) sur le fichier voulu. Mais printf fopen fera différemment sur Linux, Windows, etc... qui eux même feront différemment sur un pc, un téléphone portable, ton routeur etc...


Message édité par ptitchep le 14-04-2010 à 16:55:03

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 14-04-2010 à 15:46:51    

merci a vous c'est résolu...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed