Vous êtes sur la page 1sur 40

CHAPITRE 9

MANIPULATIONS DES
FICHIERS TEXTES ET
BINAIRES EN C

Mme TEMIMI.O
Année Universitaire: 2023/2024
I. Définition

Un fichier est caractérisé par son identification, son


emplacement, sa taille, sa date de création et éventuellement
sa date de mise à jour.

Les fichiers sont désignés par un pointeur sur une structure


baptisée FILE (majuscule obligatoire).

La déclaration s'effectue par :

FILE *pointeur_fichier.

Pointeur_fichier est ici l'identificateur du pointeur sur la


structure FILE.
1ére Génie Info A&B 2
I. Définition
La mémoire tampon

Pour des raisons d'efficacité, les accès à un fichier se font par


l'intermédiaire d'une mémoire tampon (angl: buffer).

La mémoire tampon est une zone de la mémoire centrale de


la machine réservée à un ou plusieurs enregistrements du
fichier. L'utilisation de la mémoire tampon a l'effet de réduire
le nombre d'accès à la périphérie d'une part et le nombre des
mouvements de la tête de lecture/écriture d'autre part.

1ére Génie Info A&B 3


I. Définition

Il existe deux fichiers spéciaux qui sont définis par défaut


pour tous les programmes :

- stdin le fichier d'entrée standard

- stdout le fichier de sortie standard

En général, stdin est lié au clavier et stdout est lié à l'écran,


c’est-à-dire les programmes lisent leurs données au clavier et
écrivent les résultats sur l'écran.

1ére Génie Info A&B 4


II. L’ouverture d’un fichier

Pour pouvoir utiliser un fichier, c’est à dire lire ou écrire


dedans, il faut d’abord l’ouvrir. C’est le système d’exploitation
qui se charge de l’ouverture d’un fichier et de sa gestion
pendant son utilisation.

La fonction fopen de la bibliothèque stdio.h permet d’ouvrir


un fichier et retourne un pointeur, de type composé FILE, sur
le fichier ouvert.

1ére Génie Info A&B 5


II. L’ouverture d’un fichier
La fonction fopen retourne NULL en cas d’échec lors de
l’ouverture.
Syntaxe:
FILE* fopen(const char *NomFichier, const char *mode);

NomFichier est le nom physique du fichier, chemin


éventuellement inclus. Par exemple, "data.txt" ou

"c:\\tmp\\data.txt". (Notez le \\ dans le chemin !)

La chaîne de caractères constante mode permet de définir :

· le type d’accès au fichier en lecture et/ou écriture ;

· le mode d’ouverture du fichier qui peut être le mode texte


ou le mode binaire. 1ére Génie Info A&B 6
II. L’ouverture d’un fichier
II.1. Les différents types d’accès à un fichier
Les différents types d’accès à un fichier sont les suivants :
• "r" ouverture d’un fichier en lecture : Le curseur est
positionné au début du fichier. Le fichier doit déjà exister,
autrement la fonction fopen return NULL ;
• "w" création et ouverture d’un fichier en écriture : Celui‐ci
est créé s'il n'existe pas, si le fichier existe, son contenu est
détruit ;
• "a" ouverture d’un fichier en écriture à la fin du fichier : si le
fichier n’existe pas, il est créé ; C'est le mode à utiliser pour
compléter un fichier existant.
1ére Génie Info A&B 7
II. L’ouverture d’un fichier
II.1. Les différents types d’accès à un fichier

• "r+" ouverture d’un fichier en lecture et écriture : le fichier


doit exister, autrement la fonction fopen return NULL ;
• "w+" création et ouverture d’un fichier en lecture et écriture
: si le fichier existe, son contenu est détruit ;
• "a+" ouverture d’un fichier en lecture et en écriture à la fin
du fichier : si le fichier n’existe pas, il est créé.

1ére Génie Info A&B 8


II. L’ouverture d’un fichier
II.2. Mode d’ouverture d’un fichier

Le langage C propose deux modes d’ouverture d’un fichier :

b (Binaire où le fichier est considéré comme une suite d’octets) ou t (Text où


le fichier est considéré comme une suite de caractères ) : cette lettre placée

en deuxième position indique si le fichier doit être accédé en


mode texte ou en mode binaire

Exemple:

"wt" (fichier texte créé avec accès en écriture seulement)

"a+b" (fichier binaire avec accès en lecture et écriture).


1ére Génie Info A&B 9
II. L’ouverture d’un fichier
II.3. La constante EOF et la fonction feof

La constante EOF, définie dans la bibliothèque stdio.h,


caractérise la fin d’un fichier.

#define EOF -1

La fonction feof de la bibliothèque stdio.h retourne une valeur


non nulle lorsque la fin d’un fichier est atteinte.

int feof(FILE *PtrFichier);

1ére Génie Info A&B 10


III. La fermeture d’un fichier

Une fois que les opérations d’entrées/sorties vers un fichier


sont terminées, il faut fermer le pointeur vers le fichier, à
l’aide de la fonction fclose de la bibliothèque stdio.h.

Syntaxe:

int fclose(FILE *PtrFichier);

La fonction fclose retourne 0 si la fermeture s’est bien


déroulée et EOF sinon.

1ére Génie Info A&B 11


IV. Manipulation d’un fichier en mode texte
Un fichier texte est considéré comme une suite de caractères,
éventuellement structurée en lignes de longueurs quelconques.
Un fichier texte est en général manipulable à l’aide d’un éditeur
de texte (exemple de fichier texte: txt, rtf,…)

L’accès à un fichier texte en lecture et écriture peut se faire de


deux façons :

➢ Caractère par caractère,

➢ Ligne par ligne.

➢ Lecture/écriture formatée
1ére Génie Info A&B 12
IV. Manipulation d’un fichier en mode texte
IV.1. Caractère par caractère
Les deux principales fonctions de la bibliothèque stdio.h pour
lire et écrire dans un fichier texte caractère par caractère sont :

int fgetc(FILE *PtrFichier);

La fonction fgetc retourne le caractère lu dans le fichier


pointé par PtrFichier sous la forme d’un entier. Cette
fonction retourne EOF s’il s’est produit une erreur ou si la
fin du fichier a été atteinte.

1ére Génie Info A&B 13


IV. Manipulation d’un fichier en mode texte
IV.1. Caractère par caractère
Exemple:

char c;

FILE *f = fopen("Test.txt", "r");

if(f!=NULL)

while ( ( c = fgetc( f ) ) != EOF )

{ ...

/* utilisation de c */

}
1ére Génie Info A&B 14
IV. Manipulation d’un fichier en mode texte
IV.1. Caractère par caractère

int fputc(int c,FILE *PtrFichier)

La fonction fputc écrit le caractère c passé en argument dans


le fichier pointé par PtrFichier et retourne le caractère écrit.
Cette fonction retourne EOF s’il s’est produit une erreur.

1ére Génie Info A&B 15


IV. Manipulation d’un fichier en mode texte
IV.1. Caractère par caractère

Exemple: Copier le fichier source.txt dans le fichier destination.txt

int c;
Ouverture du fichier en
FILE *f1,*f2; mode lecture

f1 = fopen ("source.txt", "r");


f2 = fopen ("destination.txt", "w");
Ouverture du fichier en
if(f1!=NULL &&f2!=NULL) mode écriture

while ( (c = fgetc (f1) ) != EOF)


fputc (c,f2) ;

1ére Génie Info A&B 16


IV. Manipulation d’un fichier en mode texte
III.2. ligne par ligne
Les deux principales fonctions de la bibliothèque stdio.h pour
lire et écrire dans un fichier texte ligne par ligne sont :

char* fgets(char *ch, int nbcarac, FILE *PtrFichier);

La fonction fgets lit des caractères dans le fichier pointé par


PtrFichier jusqu’à ce que :

· soit elle rencontre le caractère « passage à la ligne »


(caractère '\n') ;

· soit le nombre de caractères déjà lu est égal à nbcarac – 1.


1ére Génie Info A&B 17
IV. Manipulation d’un fichier en mode texte
III.2. ligne par ligne

Le résultat est stocké dans la chaîne ch passée en argument, à


laquelle est ajoutée le caractère de fin de chaîne '\0'.

La fonction fgets retourne NULL s’il s’est produit une erreur ou


si la fin du fichier a été atteinte.

1ére Génie Info A&B 18


IV. Manipulation d’un fichier en mode texte
III.2. ligne par ligne
Exemple

Soit ch un tableau de 9 caractères (char ch[9];).

Si on tape "Bonjour\n",

avec l’instruction fgets(ch,7,stdin); on a : ch : B o n j o u \0

avec l’instruction fgets(ch,8,stdin); on a : ch : B o n j o u r \0

avec l’instruction fgets(ch,9,stdin); on a : ch: B o n j o u r \n \0

1ére Génie Info A&B 19


IV. Manipulation d’un fichier en mode texte
III.2. ligne par ligne

int fputs(const char *ch,FILE *PtrFichier)

La fonction fputs écrit la chaîne de caractère ch passée en


argument dans le fichier pointé par PtrFichier et retourne
une valeur non nulle s’il n’y a pas eu d’erreur lors de l’écriture
ou EOF sinon.

1ére Génie Info A&B 20


IV. Manipulation d’un fichier en mode texte
III.2. ligne par ligne
Exemple:
char ligne[100];
FILE *f = fopen ("Test.txt" , "a") ;
if(f!=NULL)
{
printf("Donnez une chaîne: ");
gets(ligne);
fputs ( ligne , f );
}

1ére Génie Info A&B 21


IV. Manipulation d’un fichier en mode texte
III.3. Lecture formatée :
Syntaxe:
int fscanf (pointeur_sur_fichier, "formats", args);

Cette fonction lit des valeurs à partir du fichier pointé par


pointeur_sur_fichier et les stocke dans les arguments args
selon les formats indiquées formats.

La fonction fscanf déplace le curseur après les valeurs lues.

N.B: Cette fonction est similaire à scanf, sauf que fscanf lit les
données à partir d’un fichier alors que scanf les lit à partir du
clavier. 1ére Génie Info A&B 22
IV. Manipulation d’un fichier en mode texte
III.3. Lecture formatée :
Exemple:
Lecture à partir d'un fichier qui contient le matricule, le nom et le
salaire des employés (un employé par ligne dans le fichier)
int m; char s[50]; float a;

FILE *f = fopen("Test.txt", "r");

if(f!=NULL)
{
fscanf (f ,"%d%s%f" ,&m, s, &a);
printf("Matricule \t Nom \t Salaire\n");
printf("%d \t %s \t %.2f \n", m, s, a);
} 1ére Génie Info A&B 23
IV. Manipulation d’un fichier en mode texte
III.3. Ecriture formatée :
Syntaxe:

int fprintf (pointeur_sur_fichier, "formats", args);

Cette fonction écrit les valeurs des arguments args dans le


fichier pointé par pointeur_sur_fichier selon les formats
indiquées formats.

N.B: Cette fonction est similaire à printf, sauf que fprintf écrit
les données dans un fichier alors que printf les affiche sur
écran.
1ére Génie Info A&B 24
IV. Manipulation d’un fichier en mode texte
III.3. Ecriture formatée :
Exemple: Écriture du matricule, du nom et du salaire d'un
employé dans un fichier ouvert en mode ajout.
int m; char s[50]; float a;
FILE *f = fopen("Test.txt", "a");
if(f!=NULL)
{
printf("Donnez le matricule: "); scanf("%d",&m);
printf("Donnez le nom: "); scanf("%s",s);
printf("Donnez le salaire: "); scanf("%f",&a);
fprintf (f, "%d %s %f \n", m, s, a);
}
1ére Génie Info A&B 25
V. Manipulation d’un fichier en mode binaire
Un fichier binaire est considéré comme une suite d’octets
(exemple de fichier binaire: .bin, .dat, .exe,…)

Un fichier binaire qui rassemble des données structurées (comme


un fichier de clients ou un fichier de produits) est en général
structuré en enregistrements de longueur fixe, chaque
enregistrement décrivant un élément du fichier (un client, un
produit,...). L’accès à un fichier binaire, structuré en articles, en
lecture et écriture peut se faire :
· séquentiellement enregistrement par enregistrement ou par
paquets d’enregistrement;
· directement en accédant à un enregistrement donné.
1ére Génie Info A&B 26
V. Manipulation d’un fichier en mode binaire

Dans les exemples qui suivent, on considérera la structure


suivante:

typedef struct {

int mat ;

char nom[30];

float salaire;

} Employe;

1ére Génie Info A&B 27


V. Manipulation d’un fichier en mode binaire

Les deux principales fonctions de la bibliothèque stdio.h pour


lire et écrire dans un fichier binaire structuré en articles sont :
Syntaxe:
fread (adr_var, taille, nbre_bloc, PtrFichier );
Où:
▪ adr_var : adresse mémoire d'une variable.
▪ nbre_bloc: nombre de blocs à lire du fichier.
▪ taille : taille en octets d'un bloc.
▪ PtrFichier : un pointeur de type FILE.
Si nbre_bloc=1, fread lit l'enregistrement courant dans la
variable indiquée, positionne le curseur sur l'enregistrement
suivant et retourne le nombre d'enregistrement lus ( 1 ).
1ére Génie Info A&B 28
V. Manipulation d’un fichier en mode binaire
Exemples:
int n;
Employe E, T[ 3 ], *p ;
FILE * f;
f = fopen ( "entreprise.dat" , "rb");
if (f == NULL)
{
puts("Erreur de lecture");
getch();
return;
}

1ére Génie Info A&B 29


V. Manipulation d’un fichier en mode binaire
Exemple1:
/******* Lecture de l'enregistrement courant *********/
n = fread ( &E, sizeof(Employe),1, f );
if (n) { ……….} /* Lecture effectuée */

/****Lecture de 3 enregistrements dans T****/


n = fread (T, sizeof(Employe), 3, f );
if (n == 3) {………..} /*Lecture de 3 enregistrements*/

/******* Lecture de m enregistrements via p *******/


p = (Employe *) malloc (m * sizeof(Employe) ) ;
n = fread (p, sizeof(Employe), m, f );
if (n == m) {……….} /*Lecture de m enregistrements*/
1ére Génie Info A&B 30
V. Manipulation d’un fichier en mode binaire
Exemple2:
Employe E;
FILE *f;
/******* Lecture d'un fichier d'employés *********/
f = fopen("entreprise.dat" , "rb");
if (f == NULL) {puts("Erreur de lecture"); getch(); return;}
printf("Matricule \t Nom \t\t Salaire \n");
while( fread(&E, sizeof (Employe),1, f ) )
{
printf("%6d \t %s \t\t %f \n", E.mat, E.nom, E.salaire);
}
fclose( f );
1ére Génie Info A&B 31
V. Manipulation d’un fichier en mode binaire
Syntaxe:
fwrite (adr_var, taille, nbre_bloc, fichier );

Où:

▪ adr_var : adresse mémoire d'une variable.

▪ nbre_bloc: nombre de blocs à écrire dans le fichier.

▪ taille : taille en octets d'un bloc.

▪ fichier : un pointeur de type FILE.

fwrite tente d'écrire nbre_bloc dans le fichier et retourne le


nombre de blocs réellement écrits.
1ére Génie Info A&B 32
V. Manipulation d’un fichier en mode binaire
Exemple 1: Écriture d'un enregistrement.

Employe E ;
FILE*f;
f = fopen("entreprise.dat" , "wb");
if (f == NULL) {puts("Erreur de lecture"); getch(); return;}
printf(" Matricule:"); scanf("%d",&E.mat);
printf("Nom: "); gets(E.nom);
printf("Salaire: "); scanf("%f",&E.salaire);
fwrite(&E, sizeof(Employe), 1, f );

1ére Génie Info A&B 33


V. Manipulation d’un fichier en mode binaire
Exemple 2: Ecriture d'un tableau de n enregistrements
int n; Employe T[100]; FILE *f;
printf("Nombre d'employés:"); scanf("%d",&n);
/***** Lecture d'un tableau d'enregistrements *****/
int i;
for(i=0; i<n; i++)
{ printf(" Matricule:"); scanf("%d",&T[ i ].mat);
printf("Nom : "); gets(T[ i ].nom);
printf("Salaire :"); scanf("%f",&T[ i ].salaire);
}
f = fopen("entreprise.dat" , "wb");
/* ou f = fopen("entreprise.dat", "ab"); */
if (f ==NULL){puts("Erreur d'ouverture");getch(); return;}
fwrite(T,sizeof(employe),n,f);
1ére Génie Info A&B 34
VI. Accès direct à un fichier

Lorsqu’un fichier binaire est structuré en articles de même


longueur, on peut accéder directement à un article dont on
connaît le rang.

Ainsi pour accéder au nième enregistrement d’un fichier, où la


taille de chaque personne est donnée par sizeof(Employe) , il
faudra se déplacer de :

(n-1) * sizeof(Employe) octets à partir du début du fichier.

1ére Génie Info A&B 35


VI. Accès direct à un fichier
Syntaxe:

size_t fseek(FILE *PtrFichier,long nb,int Origine);

La fonction fseek déplace le pointeur PtrFichier de nb octets à


partir de la position donnée par l’argument Origine, qui peut
prendre une des valeurs suivantes :

• SEEK_SET : Début du fichier

• SEEK_CUR : Position courante

• SEEK_END : Fin du fichier.

1ére Génie Info A&B 36


VI. Accès direct à un fichier
Exemple:

FILE *f;

f = fopen("entreprise.dat","rb");

…..

// se positionner au début (le premier enregistrement)

fseek( f , 0, SEEK_SET);

// se positionner sur le dernier enregistrement

fseek( f , - sizeof(Employe), SEEK_END);

37
1ére Génie Info A&B
VII. Position courante du curseur:
Syntaxe:

long ftell(FILE * PtrFichier);


retourne la valeur de la position courante du pointeur dans le
fichier indiqué s'il n'y a pas d'erreur. Elle indique :
le nombre d'octets entre la position courante et le début du
fichier pour les fichiers binaires.
Exemple:
FILE *f; long n;
f = fopen( "entreprise.dat","rb");
….
n = ftell( f );
1ére Génie Info A&B 38
VIII. Remettre le curseur au début du fichier

Syntaxe:

rewind ( FILE * PtrFichier );

Cette fonction permet de remettre le descripteur du fichier au


début

Exemple:
FILE *f;
f = fopen( "entreprise.dat","rb");
…..
rewind( f );
1ére Génie Info A&B 39
IX. Renommer un fichier:
Syntaxe:

rename ( ancien_nom_fichier , nouveau_nom_fichier );

La fonction rename de la bibliothèque stdio.h permet de


renommer un fichier

Exemple:

rename( "Test1.txt", "Test2.txt" );

1ére Génie Info A&B 40

Vous aimerez peut-être aussi