C.1 Ouverture et fermeture d'un flot
C.1.1 Les fonctions fopen() et fclose() ; Gestion des erreurs
La fonction fopen() ouvre un fichier et lui associe le flot
de donnée du type FILE qu'elle retourne. Sa syntaxe est :
fopen("nom_de_ficher","mode") ;
Si une erreur survient lors de l'exécution de cette fonction, la
valeur retournée est le pointeur NULL dont on peut
retrouver la définition à partir du fichier stdio.h. Le
mode correspond à une chaîne de caractères envoyée comme
argument à la fonction fopen et qui spécifie le mode
d'ouverture du fichier (lecture, écriture, etc.) ; on peut consulter
le manuel de fopen pour le détail des modes (man
fopen).
Il est vivement recommandé de tester la valeur renvoyée par la
fonction fopen afin de détecter d'éventuelles erreurs.
De plus, on dispose sous certains système d'exploitation d'un
mécanisme permettant d'obtenir de l'information sur les erreurs
potentielles. Dans notre cas, on peut faire comme suit :
#include <stdio.h>
#include <errno.h>
int main(void){
FILE *fd = fopen("fichierquinexistepas","r") ;
if (fd==NULL){
perror("L'erreur suivante est survenue") ;
return -1 ;
}
fclose(fd) ; /* fclose ferme le flot */
return 0 ;
}
La fonction fclose() permet de fermer le flot associé à
un fichier par la fonction fopen(). Cette fonction retourne
l'entier 0 si, et seulement si, la fermeture s'est déroulée
normalement.
C.1.2 La structure FILE
Pour information, nous explicitons la structure FILE
utilisée pour gérer les flots :
_IO_FILE {
int _flags; /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags
/* The following pointers correspond to the C++ streambuf protocol. */
/* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
char* _IO_read_ptr; /* Current read pointer */
char* _IO_read_end; /* End of get area. */
char* _IO_read_base; /* Start of putback+get area. */
char* _IO_write_base; /* Start of put area. */
char* _IO_write_ptr; /* Current put pointer. */
char* _IO_write_end; /* End of put area. */
char* _IO_buf_base; /* Start of reserve area. */
char* _IO_buf_end; /* End of reserve area. */
/* The following fields are used to support backing up and undo. */
char *_IO_save_base; /* Pointer to start of non-current get area. */
char *_IO_backup_base; /* Pointer to first valid character of backup area */
char *_IO_save_end; /* Pointer to end of non-current get area. */
struct _IO_marker *_markers;
struct _IO_FILE *_chain;
int _fileno;
int _blksize;
_IO_off_t _old_offset; /* This used to be _offset but it's too small. */
#define __HAVE_COLUMN /* temporary */
/* 1+column number of pbase(); 0 is unknown. */
unsigned short _cur_column;
signed char _vtable_offset;
char _shortbuf[1];
/* char* _save_gptr; char* _save_egptr; */
_IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};
Pour tout commentaire : Alexandre Sedoglavic.