Les données
stockées en mémoire sont perdues dès la sortie du programme. Les fichiers sur
support magnétique (bande, disquette, disque) sont par contre conservables,
mais au prix d'un temps d'accès aux données très supérieur. On peut distinguer
les fichiers séquentiels (on accède au contenu dans
l'ordre du stockage) ou à accès direct (on peut
directement accéder à n'importe quel endroit du fichier). Les fichiers sont
soit binaires soit Textes.
Un
fichier texte est un
fichier constitué de lignes de texte (caractères ASCII), séparées par une
marque de fin de ligne (notée \n).
Un
fichier binaire est
simplement constitué d'une suite d'octets de valeurs quelconques.
Un "fichier" est
donc une suite d'informations stockées en général en mémoire secondaire (disque
dur…).
Fichiers textes
(séquentiels)
Assurez-vous
donc, pour commencer, que vous incluez bien au moins les bibliothèques stdio.h et stdlib.h en haut de
votre fichier .c :
12 |
#include <stdlib.h> #include <stdio.h> |
Voici ce qu'il faut faire à chaque fois dans
l'ordre quand on veut ouvrir un fichier (que ce soit pour lire ou pour écrire
dedans) :
Voyons le prototype de la fonction fopen : |
Cette
fonction attend 2 paramètres :
|
int main() { FILE* fichier = NULL; return 0;} |
Le pointeur est initialisé à NULL dès le début.
Maintenant, nous allons appeler la fonction fopen et récupérer la valeur qu'elle renvoie dans le pointeur
"fichier ‘’ Voici les modes d'ouvertures possibles :
|
int main() { FILE* fichier = NULL; fichier = fopen("test.txt", "r+"); return 0;} |
|
|
fichier = fopen("C:\\Program Files\\Notepad++\\readme.txt", "r+"); |
|
Ce code ouvre le fichier readme.txt situé dans
"C:\Program Files\Notepad++"
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().
|
int main() { FILE* fichier = NULL; fichier = fopen("test.txt", "r+"); if (fichier != NULL) { // On peut lire et écrire dans le fichier } else { // On affiche un message d'erreur si on veut printf("Impossible d'ouvrir le fichier test.txt");} return 0;} |
|
fclose(fichier); |
Il existe plusieurs fonctions capables d'écrire
dans un fichier. Ce sera à vous de choisir celle qui est la plus adaptée à
votre cas.
Voici les 3 fonctions que nous allons étudier :
Ce
code demande l'âge de l'utilisateur et l'écrit dans le fichier :
|
int main() { FILE* fichier = NULL; int age = 0; fichier = fopen("test.txt", "w"); if (fichier != NULL){ // On demande l'âge printf("Quel age avez-vous ? "); scanf("%d", &age); // On l'écrit dans le fichier fprintf(fichier, "Le Monsieur qui utilise le programme, il a %d ans", age); fclose(fichier);} return 0;} |
Nous pouvons utiliser quasiment les mêmes
fonctions que pour l'écriture, le nom change juste un petit peu :
Cette
fonction lit dans un fichier qui doit avoir été écrit d'une manière précise.
Supposons que votre fichier contienne 3 nombres séparés par un espace, qui sont
par exemple les 3 plus hauts scores obtenus à votre jeu :15
20 30
Vous voudriez récupérer chacun de ces nombres dans une variable de type int.
La fonction fscanf va vous permettre de faire ça
rapidement.
|
int main(int argc, char *argv[]) { FILE* fichier = NULL; int score[3] = {0}; // Tableau des 3 meilleurs scores fichier = fopen("test.txt", "r"); if (fichier != NULL) { fscanf(fichier, "%d %d %d", &score[0], &score[1], &score[2]); printf("Les meilleurs scores sont : %d, %d et %d", score[0], score[1], score[2]); fclose(fichier);} return 0;} |
||
|
|
|
||
rename : renomme un fichier. Ex :rename("test.txt",
"test_renomme.txt");remove : supprime un fichier . ex : remove("test.txt");
Il existe 3 fonctions à connaître :
Renommer et supprimer un
fichier
SERIE
D’EXERCICES 5:
Exercice1 :
Créer sur disque puis afficher à l'écran un
fichier (le nom du fichier est à saisir au clavier) dont les informations sont
structurées de la manière suivante : Nom (chaîne de 12 caractères),Prénom
(chaîne de 12 caractères).Le nombre d'enregistrements à créer est à entrer
aussi au clavier par l'utilisateur.
Exercice2 :
Modifier
l’exercice 1 en ajoutant le N° téléphone (de type entier) et en utilisant
une structure : d’abord en utilisant une variable enregistrement
puis en utilisant un pointeur sur la structure.
Exercice3
(tel)
A l'aide d'un tableau de personnes (nom, prénom, numéro dans la rue, rue, code
postal, ville, numéro de téléphone), faire un programme de recherche
automatique de toutes les informations sur les personnes répondant à une valeur
d'une rubrique donnée (tous les Mohammed, tous ceux d'Oujda, travaillant au
CPGE, etc...). On suppose que le tableau est déjà
initialisé.
Exercice 4 :(agenda) : modifier l'agenda de l'exercice tel
en permettant de sauver les données sur disque. On utilisera un fichier binaire
à accès direct. On pourra ensuite apporter les améliorations suivantes :
recherche rapide par dichotomie sans lire tout le fichier (en le supposant
classé par ordre alphabétique), création de fichiers index classés
alphabétiquement sur les noms, département et ville pour accès rapide par
dichotomie, les autres se faisant par recherche séquentielle, avec possibilité
d'ajout, suppression, édition du fichier
Exercice5 : (fic_formaté)
:
modifier le programme de produit de matrices en lui permettant de donner sur la
ligne de commande trois noms de fichiers : les deux premiers contiendront la
description des matrices à multiplier, le dernier sera créé et contiendra le
résultat. Les fichiers seront formatés, contiendront en première ligne le
nombre de lignes puis le nombre de colonnes, puis chaque ligne du fichier
contiendra une ligne de la matrice.
Solution
Exercice1 :
#include <stdio.h>
#include <stdlib.h>
FILE
*P_fichier;
char
nom_fichier[12],nom_per[12];
int nb,i;
void main()
{ printf("Entrez
le nom du ficher:\t");
scanf("%s",&nom_fichier);
P_fichier=fopen(nom_fichier,"w");
printf("Entrez
le nombre de personne :\t");
scanf("%d",&nb);
//Ecriture dans le fichier
for(i=0;i<nb;i++)
{
printf("\n\tentrez
nom d'une personne\t");
scanf("%s",&nom_per);
fprintf(P_fichier,"%s\n",nom_per);
}
fclose(P_fichier);
//lecture du fichier
P_fichier=fopen(nom_fichier,"r");
for(i=0;i<nb;i++)
{ fscanf(P_fichier,"%s\n",nom_per);
printf("nom : %s\n",nom_per);
}
fclose(P_fichier);
getch();}
Exercice 2 :
#include <stdio.h>
#include <stdlib.h>
FILE
*p;
struct emploi
{
int num;
char nom[20];
char prenom[20];
};
char nom_fichier[12];
int nb,i;
int main()
{
struct emploi
a,*pi;
pi=&a;
printf("\n\n\tEntrez le nom du ficher:\t");
scanf("%s",&nom_fichier);
p=fopen(nom_fichier,"w");
printf("\n\nEntrez le nombre de personnes :\t");
scanf("%d",&nb);
//ecriture
for(i=0;i<nb;i++)
{
printf("\n\tentrez nom d'une personne\n");
scanf("%s",&(pi->nom));
fprintf(p,"%s\t\t",(pi->nom));
printf("\n\tentrez le prenom de cette personne\n");
scanf("%s",&(pi->prenom));
fprintf(p,"%s\t\t",(pi->prenom));
printf("\n\tentrez num de tel de cette personne\n");
scanf("%d",&(pi->num));
fprintf(p,"%d\t\t",(pi->num));
}
fclose(p);
//lecture
p=fopen(nom_fichier,"r");
printf("\n\nEntrez le nombre de personnes :\t");
scanf("%d",&nb);
for(i=0;i<nb;i++)
{
fscanf(p,"%s\t\t",(pi->nom));
printf("%s\n",(pi->nom));
fscanf(p,"%s\t\t",(pi->prenom));
printf("%s\n",(pi->prenom));
fscanf(p,"%d\t\t",&(pi->num));
printf("%d\t\t",(pi->num));
}
fclose(p);
getch();
}