• Aucun résultat trouvé

Cette partie 1 (ex1 --> ex5) porte sur les fichiers de texte.

N/A
N/A
Protected

Academic year: 2022

Partager "Cette partie 1 (ex1 --> ex5) porte sur les fichiers de texte. "

Copied!
7
0
0

Texte intégral

(1)

Faculté des Sciences de Rabat MODULE M21 (SMI4) Département d'Informatique

Travaux Dirigés de Programmation II

[Solutionnaire TD n° 4 : Les Fichiers en C (Partie I)]

Objectifs :-Manipulation en C, des fichiers (de texte et binaires)

.

Cette partie 1 (ex1 --> ex5) porte sur les fichiers de texte.

Je rappelle qu'un fichier en C est vu comme une suite d'octets. C’est le programmeur qui donne une interprétation à ces octets. Ici, on manipule des fichiers de texte qui sont par définition visualisables à l'aide d'un éditeur de texte. Un programme source est un exemple de fichier de texte (ce qui est tapé ou saisi dans l'éditeur est visualisé à l'écran).

Un fichier de texte est vu comme une suite de caractères car un caractère est codé sur un octet.

Un fichier de texte pourra donc être traité de 3 façons différentes : caractère par caractère, ligne de caractère par ligne, ou par données formatées.

Avant de traiter le contenu du fichier, il faut commencer par ouvrir ce fichier. L'ouverture d'un fichier consiste à faire correspondre un nom physique de ce fichier (nom de sauvegarde sur machine) à un nom logique (variable de type FILE * utilisée dans le programme).

Pour ouvrir le fichier, on utilise la fonction fopen qui recoit le nom physique (une chaine de caractères) et le mode d'ouverture de ce fichier (une chaîne de caractères).

Par exemple FILE *fp=fopen("fproduit.txt","r");

Exercice 1

On dispose du fichier “produits.txt“ suivant :

73 Ordinateur 5000.00

07 Cle_8GO 120.00

15 Disque_Externe 960.00

… … …

… … …

Chaque ligne de ce fichier de texte décrit un produit : le code du produit (un entier), le nom du produit (une chaîne de caractères) et le prix du produit (un réel).

Le but ici est de se familiariser avec le traitement du contenu d'un fichier de texte de 3 façons différentes.

Le fichier est supposé déjà créé et comme exemple de traitement l'affichage de son contenu.

Nous définissons des fonctions de lecture ayant comme argument le nom logique d'un fichier de texte.

Dans ce cas, l'ouverture du fichier se fera une seule fois dans la fonction main et non pas dans les fonctions à définir. De même pour la fonction de fermeture de fichier fclose qu'on place dans le main. Par conséquent, le nom logique est utilisé comme argument des fonctions.

(2)

Comme application, un fichier de produits où chaque produit est décrit par 3 informations placées dans une ligne du fichier et séparées par un ou plusieurs espaces. Au niveau de l'énoncé, j'ai schématisé un exemple d'organisation de ce fichier.

Nous utilisons dans cet exercice pour chaque cas des fonctions bien définies au niveau du cours telles que : fgetc ou getc, fgets et fscanf pour la lecture du fichier, respectivement putchar, fputs et fprintf ou printf pour l'affichage (écriture sur le fichier standard écran).

Je vous demande de bien étudier et comprendre le prototype de chacune de ces fonctions afin de savoir les bien utiliser : bien comprendre le rôle joué par leurs arguments ainsi que par leur valeur de retour.

Ce qu'il faut retenir sur les fichiers, parmi d’autres choses :

- Après ouverture d'un fichier, il y a la mise en place automatique d'un pointeur d'octets qui pointe le début du fichier (pointe le 1er octet)

- Après une lecture ou une écriture dans ce fichier, le pointeur est déplacé automatiquement d'une longueur égale à la taille en octets de l'information écrite dans le fichier ou lue du fichier . On parle de déplacement automatique du pointeur courant dans le fichier

Ainsi, remarquer l'introduction dans le programme main des fonctions fseek ou rewind. Ces deux fonctions telles qu'elles sont utilisées (c-à-d les valeurs des arguments sont bien choisies) permettent de ramener le pointeur de fichier en son début...

Ci-dessous, les fonctions demandées :

#include<stdlib.h>

#include<stdio.h>

typedef struct produit { int code; // code produit

char nom[30]; // désignation produit float prix; / prix unitaire produit } Produit;

void lecture_caractere(FILE *);

void lecture_ligne(FILE *);

void lecture_format(FILE *);

int main() {

FILE *f; //nom logique du fichier

// Ouvrir le fichier en lecture

if ((f=fopen("produits.txt","r"))==NULL) { printf("Problème ouverture de fichier !\n");

exit(-1);

}

(3)

lecture_caractere(f); // lit par caractère et affiche

fseek(f,0L,SEEK_SET); // aller au début du fichier lecture_ligne(f); // lit par ligne et affiche

rewind(f); // revenir au début du fichier (une 2ème façon) lecture_format(f); // lit en formattantles données et affiche

fclose(f); // fermer le fichier

return 0;

}

a)-

void lecture_caractere(FILE *pf) {

// Lecture par caractère d'un fichier de texte // supposé déjà ouvert en mode lecture

// pf est son nom logique char c;

printf("Lecture caractère par caractère du fichier

\"produits.txt\" :\n");

while((c=getc(pf))!=EOF) putchar(c);

}

b)-

void lecture_ligne(FILE *pf) {

// Lecture par ligne d'un fichier de texte // Supposé déjà ouvert en mode lecture char ch[80];

printf("Lecture ligne par ligne du fichier \"produits.txt\" :\n");

while((fgets(ch,80,pf))!=NULL)

fputs(ch,stdout); // stdout est associé automatiquement à l’écran // vu en tant qu’un fichier de texte standard }

c)-

void lecture_format(FILE *pf) {

// Lecture par formattage de données d'un fichier de texte // supposé déjà ouvert en mode lecture

Produit p;

printf("Lecture formatée du fichier \"produits.txt\" :\n");

(4)

while( fscanf(pf,"%d %s %f", &p.code, p.nom, &p.prix))!=EOF) printf("%d %s %5.2f\n", p.code, p.nom, p.prix);

}

Exercice 2

Le but de cet exercice est de sauvegarder le contenu d'un tableau de réels dans un fichier de texte.

L’organisation de ce fichier est laissée libre au programmeur, par exemple un réel par ligne du fichier.

void save_tab_reels(float tr[], int n, char *nomfich){

// Sauvegarde le contenu d'un tableau dans un fichier FILE *pf;

pf=fopen(nomfich,"wt"); // ouvrir en mode écriture if (!pf) {

printf("Problème de création de fichier !\n");

exit(-1);

} else { int i;

for(i=0; i<n; i++)

fprintf(pf,"%f\n",tr[i]);

fclose(pf);

} }

Exercice 3

Ici, des exemples de comptage d'informations (caractères, mots ou lignes de caractères) dans un fichier de texte. Remarquer que l’on pourrait même se ramener à des chaînes de caractères. C’est le cas de la question b) qui est la plus intéressante à étudier et comprendre.

a)-

int compte_car(FILE *pf) {

// Compte les caractères d'un fichier de texte // supposé déjà ouvert en lecture

int c, // caractere lu du fichier cpt=0; // compteur

while((c=fgetc(pf))!=EOF) cpt++;

return cpt;

}

(5)

b)-

int compte_mot(FILE *pf) {

// Compte les mots d'un fichier de texte // supposé déjà ouvert en lecture

// les mots sont séparés des espaces ou retour à la ligne int c, // caractère lu du fichier

cpt=0, // compteur dans_mot=0;

// drapeau pour savoir si on est à l'intérieur (=1) // ou en dehors d'un mot (=0)

while((c=fgetc(pf))!=EOF) if((c!=' ') && (c!='\n'))

if (dans_mot==0) { cpt++;

dans_mot=1;

} else

dans_mot=0;

return cpt;

}

c)-

int compte_ligne(FILE *pf) {

// compte les lignes d'un fichier de texte // supposé déjà ouvert en lecture

int c, // caractère lu du fichier cpt=0; // compteur

while((c=fgetc(pf))!=EOF) if (c=='\n')

cpt++;

return cpt;

}

Exercice 4

Ici, un autre exemple d’application des fichiers de texte. Dans cet exercice il faut bien faire attention à l’énoncé, par exemple l'ouverture et la fermeture de fichier se font dans la fonction. La aussi on pourrait se ramener à la manipulation de chaînes de caractères

a)-

int foccur_mot(char *mot){

// Retourne le nombre d'occurrences de mot dans un fichier de texte FILE *pf;

(6)

char ch[100];

int occur=0;

printf("Nom de fichier de texte ? :");

scanf("%s",ch);

pf=fopen(ch,"rt");

if (!pf) {

printf("Problème ouverture fichier !\n");

exit(-1);

}

while(fscanf(pf,"%s",ch)>0) if strcmp(ch,mot)==0)

occur++;

fclose(pf);

return occur;

}

b)-

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

int main(){

char un_mot[100];

printf("Entrez un mot d'au plus 100 caractères : ");

gets(un_mot);

printf("Nombre occurrences de \"%s\" dans un fichier de texte est :\n", un_mot,foccur_mot(un_mot));

return 0;

}

Exercice 5

Une autre application des fichiers de texte : la recherche d’information. La encore une fois, l'ouverture et la fermeture de fichier se font dans la fonction. On se ramène à la manipulation de chaînes de caractères afin d’utiliser tout ce que nous avions étudié sur les chaînes de caractères en termes de fonctions de manipulation de ces chaînes.

Par exemple, dans la solution proposée ci-dessous j’utilise la fonction strncmp

(ch,

"

while

"

,5) au

lieu de

strstr (ch,"while") , où ch est la ligne/chaîne lue à partir du fichier.

En effet, strstr (ch,"while") recherche la 1ère occurrence du "while" dans ch et elle peut la retrouver pas nécessairement au début. En voici un exemple d'une ligne de code :

if (n>0) while (n) {printf("%d ",n); n--; }

(7)

Un deuxième exemple serait le cas où "while" n'est pas en début de ligne, c-à-d il y a un espace avant le while

Par conséquent, j’utilise par exemple la fonction strncmp en vue de comparer les premiers caractères en début de ligne avec "while"

Ci-dessous, une proposition de solution :

int compte_while_ligne(char *nomf) {

// Compte le nombre de lignes commençant par "while"

// dans un fichier de texte connaissant son nom FILE *pf;

char ch[100];

char mot[]="while";

int nb=0;

pf=fopen(nomf,"rt");

if (!pf) {

printf("Problème ouverture fichier !\n");

exit(-1);

}

while(fgets(ch,100,pf)!=NULL)

if (strncmp(ch,mot,strlen(mot))==0) nb++;

fclose(pf);

return nb;

}

Références

Documents relatifs

Bruno Bouzy UFR math info.. On écrira une fonction pour chacun des quatre opérateurs. Pourquoi?. 5)Programmer les fonctions CARRE qui reçoit en paramètre entier et lui affecte

Montrer par un développement limité que loin du solénoïde sur l’axe Oz, le champ magnétique se comporte comme celui d’un dipôle de moment magné- tique M dont on

[r]

dans la vallée du Nevada, qu'il dévalait pour s'évader, sur un vilain vélo. volé, qu'il a volé dans une villa, et le valet qui

Personnels Possessifs Démonstratifs Relatifs Numéraux et!. indéfinis Possessifs

Comme ces deux ensembles sont dans {0, 1, · · · , n} qui contient n + 1 éléments et que la somme de leurs nombres d'élément est strictement plus grande, leur intersection est

Taper = (Pour signifier que nous effectuons un calcul ) puis la formule 2×A4+3 (Au lieu de taper A4 nous pouvons cliquer sur la cellule avec la souris).. 4 Procéder de

Pour prévoir à partir des effets significatifs observés pour certaines doses, ce qui devrait se passer à des doses plus faibles ou pendant des temps plus longs, trois méthodes