Informatique et Programmation Examen N°2
5 juin 2007 18h30-20h30
Nom : Prénom :
Nom de la machine : Répertoire de travail : Remarques :
Exercice 1 :
Analyser le programme personne.c fourni en annexe.
1) Quelle est la taille du fichier personne.dat ? Justifiez votre réponse en décrivant la structure du fichier (nom, taille et valeur des champs).
2) Quelle est la taille du type de données "Personne" ?
3) Comment faudrait-il modifier le programme pour que le fichier personne.dat soit en mode texte ?
4) Quelle serait la taille du nouveau fichier ?
Exercice 2 :
Ecrire un programme numligne.c qui affiche le contenu d'un fichier texte en numérotant les lignes. L'affichage devra s'effectuer à l'écran ou dans un fichier de sortie si l'utilisateur le souhaite. Les paramètres (noms des fichiers d'entrée et de sortie) pourront être passés en arguments sur la ligne de commande.
Exercice 3 :
Ecrire un programme cmots.c qui compte les mots contenus dans un fichier et affiche le résultat. De manière à vérifier le bon fonctionnement du programme, on pourra afficher les mots comptabilisés.
Annexe
1 /*************************************
2 * Programme personne.c * 3 *************************************/
4
5 #include <stdio.h>
6
7 typedef struct {
8 char nom[20],prenom[20];
9 char age;
10 } Personne;
11
12 int main() 13 {
14 FILE *f;
15 Personne p,p2;
16
17 sprintf(p.nom,"Martin");
18 sprintf(p.prenom,"Jean");
19 p.age=0x14;
20
21 // Ecriture
22 f=fopen("personne.dat","wb");
23 fwrite(&p,sizeof(Personne),1,f);
24 fclose(f);
25 26
27 // Verification
28 f=fopen("personne.dat","rb");
29 fread(&p2,sizeof(Personne),1,f);
30 fclose(f);
31 printf("Nom : %s\n",p2.nom);
32 printf("Prenom : %s\n",p2.prenom);
33 printf("Age : %d\n",p2.age);
34 return 0;
35 }
Correction
Exercice 1 :
1) Le fichier personne.dat contient 41 octets :
nom : 20 octets prenom : 20 octets
age : 1 octet nom : Martin\0xxxxxxxxxxxxx (x signifie "indéfini")
prenom : Jean\0xxxxxxxxxxxxxxx age : 20
2) La taille (donnée par sizeof()) du type de données Persone est 41 octets.
3) Il faudrait ouvrir le fichier en mode "wt" (ou "w") puis en mode "rt" (ou "r") et utiliser des printf() et scanf() pour écrire et lire :
1 /*************************************
2 * Programme personne.c * 3 *************************************/
4
5 #include <stdio.h>
6
7 typedef struct {
8 char nom[20],prenom[20];
9 char age;
10 } Personne;
11
12 int main() 13 {
14 FILE *f;
15 Personne p,p2;
16
17 sprintf(p.nom,"Martin");
18 sprintf(p.prenom,"Jean");
19 p.age=0x14;
20
21 // Ecriture
22 f=fopen("personne.dat","wt");
23 fprintf(f,"%s %s %c",p.nom,p.prenom,p.age);
24 fclose(f);
25
26 // Verification
27 f=fopen("personne.dat","rt");
28 fscanf(f,"%s %s %c",p2.nom,p2.prenom,&p2.age);
29 fclose(f);
30 printf("Nom : %s\n",p2.nom);
31 printf("Prenom : %s\n",p2.prenom);
32 printf("Age : %d\n",p2.age);
33 return 0;
34 }
4) La taille serait de 6+1 pour le nom et son espace, 4+1 pour le prenom et son espace et 1
Exercice 2 :
1 /*************************************
2 Programme numligne.c
3 *************************************/
4
5 #include <stdio.h>
6 #define LLIGNE 200 7
8 int main(int argc, char **argv) { 9 FILE *in=NULL,*out=stdout;
10 char ligne[LLIGNE];
11 int n;
12 if(argc<2) {
13 printf("usage : %s fichier_entree [fichier_sortie]\n", 14 argv[0]);
15 goto fin;
16 }
17 if((in=fopen(argv[1],"r"))==NULL) {
18 printf("erreur : Impossible d'ouvrir le fichier d'entree "
19 "\"%s\"\n",argv[1]);
20 goto fin;
21 }
22 if(argc>2 && (out=fopen(argv[2],"w"))==NULL) {
23 printf("erreur : Impossible d'ouvrir le fichier de sortie "
24 "\"%s\"\n",argv[2]);
25 goto fin;
26 }
27 for(n=1; fgets(ligne,LLIGNE,in)!=NULL; ++n) { 28 if(fprintf(out,"%3d %s",n,ligne)==0) {
29 printf("erreur : Impossible d'ecrire la ligne %d dans "
30 "fichier de sortie\n",n);
31 goto fin;
32 } 33 } 34 35 fin:
36 if(in) fclose(in);
37 if(out && out!=stdout ) fclose(out);
38 return 0;
39 }
Exercice 3 :
Version simple basée sur scanf()
1 /*************************************
2 Programme cmots1.c
3 *************************************/
4
5 #include <stdio.h>
6 #define LLIGNE 200 7
8 int main(int argc, char **argv) { 9 FILE *in=NULL,*out=stdout;
10 char ligne[LLIGNE];
11 int n;
12
13 if(argc<2) {
14 printf("usage : %s fichier_entree\n",argv[0]);
15 goto fin;
16 }
17 if((in=fopen(argv[1],"r"))==NULL) {
18 printf("erreur : Impossible d'ouvrir le fichier d'entree "
19 "\"%s\"\n",argv[1]);
20 goto fin;
21 }
22 for(n=1; fscanf(in,"%s",ligne)==1; ++n) { 23 printf("%3d %s\n",n,ligne);
24 }
25 printf("\"%s\" contient %d mots\n",argv[1],n);
26 27 fin:
28 if(in) fclose(in);
29 if(out && out!=stdout ) fclose(out);
30 return 0;
31 }
Version plus élaborée
1 /*************************************
2 Programme cmots.c
3 *************************************/
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <ctype.h>
9
10 #define LMOT 100
11 int main(int argc, char **argv) 12 {
13 FILE *in=NULL,*out=NULL;
14 char c,mot[LMOT];
15 int n,dmot,ok;
16 if(argc<2) {
17 printf("usage : %s fichier_entree\n",argv[0]);
18 goto fin;
19 }
20 if((in=fopen(argv[1],"r"))==NULL) {
21 printf("erreur : Impossible d'ouvrir le fichier d'entree "
22 "\"%s\"\n",argv[1]);
23 goto fin;
24 }
25 if(argc>2 && (out=fopen(argv[2],"w"))==NULL) {
26 printf("erreur : Impossible d'ouvrir le fichier de sortie "
27 "\"%s\"\n",argv[2]);
28 goto fin;
29 }
30 printf("out %s %p\n",argv[2],out);
31
32 n=0;
33 dmot=0;
34 while((c=fgetc(in))!=EOF) {
35 ok=(tolower(c)>='a' && tolower(c)<='z');
36 if(!dmot) { 37 if(ok) {
38 mot[dmot]=c;
39 dmot++;
40 } 41 } else { 42 if(!ok) { 43 ++n;
44 if(dmot<LMOT) mot[dmot]='\0';
45 printf("%d %s\n",n,mot);
46 dmot=0;
47 } else {
48 if(dmot<LMOT) mot[dmot]=c;
49 dmot++;
50 } 51 } 52 }
53 mot[LMOT-1]='\0';
54 printf("\"%s\" contient %d mots\n",argv[1],n);
55 56 fin:
57 if(in) fclose(in);
58 if(out) fclose(out);
59 return 0;
60 }