Vous êtes sur la page 1sur 29

Manipulation des

fichiers en c
Techniques d’Indexation et Recherche Multimédia
Amira JOUIROU
Plan
A. Ouvrir et fermer un fichier

B. Ecrire et lire dans un fichier

C. Se déplacer dans un fichier

D. Renommer et supprimer un fichier


2
Ouvrir et fermer un fichier
Insertion des bibliothèques:
#include<stdio.h>
#include<stdlib.h>
1. Insertion de la fonction d'ouverture de fichier fopen qui nous renvoie un pointeur sur le fichier.
2. Vérification de l'ouverture (c'est-à-dire si le fichier existait) en testant la valeur du pointeur qu'on a reçu.
➢ Si le pointeur vaut NULL: l'ouverture du fichier n'a pas marché, dans ce cas on ne peut pas continuer (il
faut afficher un message d'erreur).
➢ Si le pointeur est différent de NULL : l'ouverture a marché, alors on peut s'amuser à lire et écrire dans
le fichier.
3. Une fois qu'on a terminé de travailler sur le fichier, il faut penser à le "fermer" avec la fonction fclose.

3
Ouvrir et fermer un fichier
fopen : ouverture du fichier

• Le prototype de la fonction fopen

FILE* fopen(const char* nomDuFichier, const char* modeOuverture);

• Cette fonction attend 2 paramètres


➢ Le nom du fichier à ouvrir.
➢ Le mode d'ouverture du fichier, c'est-à-dire une indication qui dit si vous voulez juste écrire dans le fichier,
juste lire dans le fichier, ou les deux à la fois
• Cette fonction renvoie un pointeur sur FILE
4
Ouvrir et fermer un fichier
fopen : ouverture du fichier
• Un pointeur sur une structure de type FILE, qui est définit dans stdio.h
• fopen renvoie un FILE*
• Récupération de ce pointeur pour pouvoir ensuite lire et écrire dans le fichier
• Création d’un pointeur de FILE au début de notre fonction
Int main(int argc, char* argv[])
{
FILE* fichier=NULL;
return0;
}
• Le pointeur est initialisé à NULL dès le début.
Rq: c'est une règle fondamentale d'initialiser les pointeurs à NULL dès le début si on n'a pas d'autre valeur à leur
donner, si vous ne le faites pas, vous risquez de planter le système par la suite.
• Appeler la fonction fopen et récupérer la valeur qu'elle renvoie dans le pointeur "fichier"
5
Ouvrir et fermer un fichier
fopen : ouverture du fichier
Les modes d'ouvertures possibles
• "r" : lecture seule. Lire le contenu du fichier, mais ne pas écrire dedans. Le fichier doit avoir été créé au préalable.
• "w" : écriture seule. Écrire dans le fichier, mais ne pas lire son contenu. Si Le fichier n'existe pas, il sera créé.
• "a" : mode d'ajout. Écrire dans le fichier, en partant de la fin du fichier. Rajouter donc du texte à la fin du fichier. Si le
fichier n'existe pas, il sera créé.
• "r+" : lecture et écriture. Lire et écrire dans le fichier. Le fichier doit avoir été créé au préalable.
• "w+" : lecture et écriture, avec suppression du contenu au préalable. Le fichier est donc d'abord vidé de son
contenu, et ensuite écrire et lire dedans. Si le fichier n'existe pas, il sera créé.
• "a+" : ajout en lecture/écriture à la fin. Écrire et lire du texte à partir de la fin du fichier. Si le fichier n'existe pas, il sera
créé.
6
Ouvrir et fermer un fichier
fopen : ouverture du fichier
• Le code suivant ouvre le fichier test.txt en mode "r+" (lecture / écriture)

Int main(int argc, char* argv[])


{
FILE* fichier= NULL;
fichier=fopen("test.txt", "r+");
return 0;
}

• Le pointeur "fichier" devient alors un pointeur sur "test.txt".


7
Ouvrir et fermer un fichier
fopen : ouverture du fichier
Où doit être situé test.txt ?
• Il doit être situé dans le même dossier que votre
projet (*.cbp).
• Pour les besoins de ce chapitre, créez un fichier
"test.txt" dans le même dossier que le *.cbp
(Project file:fichier.cbp)
Le fichier doit-il être de type .txt ?
• Non. C'est vous qui choisissez l'extension lorsque
vous ouvrez le fichier. Vous pouvez très bien
inventer votre propre format de fichier ".niveau"
pour enregistrer les niveaux de vos jeux par
exemple.
8
Ouvrir et fermer un fichier
fopen : ouverture du fichier
Le fichier doit-il être obligatoirement dans le même répertoire que l'exécutable ?
• Non plus. Il peut être dans un sous-dossier:
fichier=fopen("dossier/test.txt", "r+");
Ici, le fichier test.txt est dans un sous-dossier appelé "dossier".
=> Cette méthode, que l'on appelle chemin relatif est plus pratique.
• Il est aussi possible d'ouvrir un autre fichier n'importe où ailleurs sur le disque dur. Dans ce cas, il faut écrire le
chemin complet (ce qu'on appelle le chemin absolu):
fichier=fopen("C:\\ProgramFiles\\Notepad++\\readme.txt","r+");
Ce code ouvre le fichier readme.txt situé dans "C:\Program Files\Notepad++".
=> Il faut mettre 2 anti slash \.
Si on mit un seul, l’ordinateur aurait cru qu’on essaie d'insérer un symbole spécial comme \n ou \t.
9
Ouvrir et fermer un fichier
Tester l'ouverture du fichier
• Le pointeur "fichier" devrait contenir l'adresse de la structure de type FILE qui sert de descripteur
de fichier. Celui-ci a été chargé en mémoire pour vous par la fonction fopen().
• A partir de là, 2 possibilités:
• Soit l'ouverture a réussi, et vous pouvez continuer (c.-à-d. commencer à lire et écrire dans le fichier).
• Soit l'ouverture a échoué parce que le fichier n'existait pas ou était utilisé par un autre programme. Dans ce cas,
vous devez arrêter de travailler sur le fichier.
• Juste après l'ouverture du fichier, il FAUT absolument vérifier si l'ouverture a réussi ou pas.
• Si le pointeur vaut NULL, l'ouverture a échoué.
• S'il vaut autre chose que NULL, l'ouverture a réussi.

10
Ouvrir et fermer un fichier
Tester l'ouverture du fichier
int main(int argc, char*argv[])
{
FILE* fichier =NULL ;
fichier=fopen("test.txt", "r+");
if(fichier !=NULL)
{
printf("On peut lire et ecrire dans le fichier");
}
else
{
// On affiche un message d'erreur si on veut
printf("Impossible d'ouvrir le fichier test.txt");
}
return 0;
} 11
Ouvrir et fermer un fichier
fclose : fermer le fichier
• Une fois que vous aurez fini de travailler avec le fichier, il faudra le "fermer". On utilise pour cela la
fonction fclose qui a pour rôle de libérer la mémoire (c.-à-d. supprimer votre fichier chargé dans la mémoire vive)
• Le prototype de la fonction fclose
int fclose (FILE* pointeurSurFichier);
• Cette fonction prend un paramètre : votre pointeur sur le fichier.
• Elle renvoie un entier (int) qui indique si elle a réussi à fermer le fichier. Cet entier vaut :
• 0 : si la fermeture a marché
• EOF : si la fermeture a échoué. EOF est un define situé dans stdio.h qui correspond à un nombre
spécial, utilisé pour dire soit qu'il y a eu une erreur, soit qu'on est arrivé à la fin du fichier. Dans le cas
présent cela signifie qu'il y a eu une erreur.
• Pour fermer le fichier, on va donc écrire : fclose(fichier);
12
Ouvrir et fermer un fichier
• Tout simplement, le schéma que nous allons suivre pour ouvrir et fermer un fichier sera le suivant
Int main(intargc, char*argv[])
{
FILE*fichier=NULL;
fichier = fopen("test.txt", "r+");
if(fichier != NULL){
// On lit et on écrit dans le fichier
// ...
fclose(fichier);// On ferme le fichier qui a été ouvert
}
return0;
} 13
Plan
A. Ouvrir et fermer un fichier

B. Ecrire et lire dans un fichier

C. Se déplacer dans un fichier

D. Renommer et supprimer un fichier


14
Ecrire et lire dans un fichier
Ecriture

• fputc : écrire un caractère (UN SEUL caractère à la fois)

• fputs : écrire une chaîne

• fprintf : écrire une chaîne "formatée", fonctionnement quasi-identique à printf


15
Ecrire et lire dans un fichier
Ecriture avec fputc
• Prototype
int fputc(int caractère, FILE* pointeurSurFichier);
• Prendre 2 paramètres
• Le caractère à écrire
• Le pointeur sur le fichier dans lequel écrire
• Retourner un entier (int)
• Si l’écriture a échoué, cet int vaut EOF
• Sinon, cet int vaut autre chose
• Exemple: écrire un code c qui permet d’écrire la lettre ‘S’ dans test.txt.
16
Ecrire et lire dans un fichier
Ecriture avec fputs
• Prototype
int fputs (const char* chaine, FILE* pointeurSurFichier);
• Prendre 2 paramètres
• La chaine à écrire
• Le pointeur sur le fichier dans lequel écrire
• Retourner un entier (int)
• Si l’écriture a échoué, cet int vaut EOF
• Sinon, cet int vaut autre chose
• Exemple: écrire un code c qui permet d’écrire " Salut L2CS" dans test.txt.
17
Ecrire et lire dans un fichier
Ecriture avec fprintf
• S'utiliser de la même manière que printf , sauf qu’il faut indiquer un pointeur de
FILE en premier paramètre.
• Exemple: écrire un code c qui demande l'âge de l’utilisateur et l’écrit dans le fichier.

18
Ecrire et lire dans un fichier
Lecture

• fgetc : lire un caractère

• fgets : lire une chaîne

• fscanf : lire une chaîne formatée


19
Ecrire et lire dans un fichier
Lecture avec fgetc
• Prototype int fgetc (FILE* pointeurDeFichier);
• Retourner un int
• Le caractère qui a été lu
• EOF si la fonction n’a pas pu lire le caractère
• Au fur et à mesure que vous lisez un fichier, vous avez un curseur virtuel qui avance.
• fgetc avance le curseur d'un caractère à chaque fois que vous en lisez un.
• Si vous appelez fgetc une seconde fois, la fonction lira donc le second caractère, puis le troisième et ainsi de suite.
 Vous pouvez faire une boucle pour lire les caractères un par un dans le fichier
• Exemple: écrire un code qui lit tous les caractères d’un fichier un à un et qui les écrit à chaque fois à
l’écran. Le boucle s’arrête quand fgetc renvoie EOF.
20
Ecrire et lire dans un fichier
Lecture avec fgets
• Lire au maximum une ligne (s’arrête au premier \n).
=> Pour lire plusieurs ligne, il faudra faire une boucle.
• Prototype char* fgets(char* chaine, int nombreDeCaracteresALire, FILE* pointeurSurFichier);

• Demander un paramètre un peu particulier qui est le nombre de caractères à lire.


=> Cela demande à la fonction fgets de s'arrêter de lire la ligne si elle contient plus de X caractères.
• Exemple 1: écrire un code c qui permet de lire une chaine de caractères et de l’écrire dans le console.
• Exemple 2: écrire un code c qui permet de lire tout le fichier.
Rq: La fonction fgets renvoie NULL si elle n'est pas parvenue à lire ce que vous avez demandé.
21
Ecrire et lire dans un fichier
Lecture avec fscanf
• Avoir le même principe que la fonction scanf .
• Exemple: soit un fichier contient 4 nombres séparés par un espace. Ecrire un code c
qui permet de récupérer chacun de ces nombres dans une variable de type int et de
les afficher.

22
Plan
A. Ouvrir et fermer un fichier

B. Ecrire et lire dans un fichier

C. Se déplacer dans un fichier

D. Renommer et supprimer un fichier


23
Se déplacer dans un fichier
• Le système de curseur permet de lire et écrire à une position précise dans le fichier.

• ftell : indiquer la position actuelle dans le fichier

• fseek : positionner le curseur à un endroit précis

• rewind : remettre le curseur au début du fichier (c'est équivalent à demander à la


fonction fseek de positionner le curseur au début).
24
Se déplacer dans un fichier
ftell : position dans le fichier
• Prototype long ftell(FILE* pointeurSurFichier);

• Retourner la position actuelle du curseur sous la forme d'un long


• Exemple : écrire un code c qui permet de lire le premier caractère de la position
actuelle du curseur.

25
Se déplacer dans un fichier
fseek : se positionner dans le fichier
• Prototype int fseek(FILE* pointeurSurFichier, long deplacement, int origine);
• Permettre de déplacer le "curseur" d'un certain nombre de caractères (deplacement) à partir de la position indiquée
par origine.
• Le nombre deplacement peut être un nombre positif (se déplacer en avant), nul (= 0) ou négatif (se déplacer en arrière).
• Le nombre origine peut être l'une des 3 constantes
• SEEK_SET : indiquer le début du fichier.
• SEEK_CUR : indiquer la position actuelle du curseur.
• SEEK_END : indiquer la fin du fichier.
• Exemple : écrire un code c qui permet de déplacer le curseur:
1. 5 caractères après le début 2. 3 caractères avant la position courante 3. À la fin du fichier
26
Se déplacer dans un fichier
rewind : retour au début
• Prototype void rewind(FILE* pointeurSurFichier);

• Cette fonction est équivalente à utiliser fseek pour nous renvoyer à la position 0
dans le fichier.

27
Plan
A. Ouvrir et fermer un fichier

B. Ecrire et lire dans un fichier

C. Se déplacer dans un fichier

D. Renommer et supprimer un fichier


28
Renommer et supprimer un fichier
• rename : renommer un fichier
• remove : supprimer un fichier
• Ces fonctions ne nécessitent pas de pointeur de fichier pour fonctionner.
• Prototype rename: int rename(const char*ancienNom, const char* nouveauNom);
• Renvoyer 0 si elle a réussi à renommer, sinon renvoyer autre chose que 0.
• Prototype remove: int remove(const char *fichierASupprimer);
• Exemple 1 : écrire un code c qui permet de renommer le fichier "test.txt" en "test1.txt".
• Exemple 2 : écrire un code c qui permet de supprimer le fichier "test1.txt".
29

Vous aimerez peut-être aussi