CPGE OUJDA                                                                    SPE                                                                                                   

LES FICHIERS DE DONNEES EN C

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)

Ouvrir et fermer un fichier

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 :

1
2
#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) :

fopen : ouverture du fichier

Voyons le prototype de la fonction fopen :
FILE* fopen(const char* nomDuFichier, const char* modeOuverture);

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++"

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().

 
 
 
 
 
 
 
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 : fermer le fichier



fclose(fichier);

Différentes méthodes de lecture / écriture

Ecrire dans le 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 :

Exemple :fprintf

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;}

Lire dans un fichier

Nous pouvons utiliser quasiment les mêmes fonctions que pour l'écriture, le nom change juste un petit peu :

Exemple : fscanf

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;}

 

 

Renommer et supprimer un fichier

rename : renomme un fichier.  Ex :rename("test.txt", "test_renomme.txt");remove : supprime un fichier . ex : remove("test.txt");

Se déplacer dans un fichier

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();

 

}