Informatique et Programmation Examen N°2
16 juin 2009 18h30-20h30
Nom : Prénom :
Nom de la machine : Répertoire de travail : Remarques :
Exercice 1 :
Ecrire un programme saisie.c qui écrit en mode texte dans le fichier "saisie.txt" des valeurs réelles demandées à l'utilisateur (une par ligne). Le nombre de valeurs traitées sera déterminé par l'utilisateur. On choisira donc une méthode d'arrêt adaptée : par exemple quand l'utilisateur saisira autre chose qu'un nombre réel.
Exercice 2 :
Ecrire un programme conv.c qui convertit un fichier texte nommé "saisie.txt" contenant des nombres réels (comme celui créé lors de l'exercice 1), en un fichier "binaire" ; c'est-à- dire ouvert en mode binaire et dans lequel, les valeurs réelles sont écrites au moyen de la fonction fwrite(). Le nom du fichier binaire pourra être déduit de celui du fichier texte en remplaçant l'extension ".txt" par ".dat".
Exercice 3 :
Ecrire un programme nomfic.c qui demande à l'utilisateur un nom de fichier et qui vérifie
que l'extension du nom de fichier fourni par l'utilisateur est bien ".txt". Dans le cas où le
nom de fichier est sans extension, le programme devra si possible simplement compléter le
nom de fichier avec l'extension ".txt".
Prototypes des fonctions utiles :
Fonctions d'entree-sortie standard :
int scanf( const char *format [,argument]... );
int printf( const char *format [, argument]... );
Fonctions d'accès aux fichiers :
FILE *fopen( const char *filename, const char *mode );
int fclose( FILE *stream );
int fscanf( FILE *stream, const char *format [, argument ]... );
int fprintf( FILE *stream, const char *format [, argument ]...);
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
Fonctions destinées aux chaines de caractères :
int sscanf( const char *buffer, const char *format [, argument ] ... );
int sprintf( char *buffer, const char *format [, argument] ... );
char *strchr( const char *string, int c );
char *strstr( const char *string, const char *strCharSet );
size_t strlen( const char *string );
Correction
Exercice 1 :
#include <stdio.h>
#include <stdlib.h>
int main() {
char *nom_fic="saisie.txt";
FILE *f;
float x;
f=fopen(nom_fic,"wt");
// On vérifie si f!=NULL if(f==NULL) {
printf("Impossible d'ouvrir le fichier \"%s\"\n",nom_fic);
return 0;
}
// On continue tant que scanf réussi à convertir un float while(scanf("%f",&x)==1) {
fprintf(f,"%f\n",x);
}
// On ferme le fichier fclose(f);
return 0;
}
Exercice 2 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100 int main() {
char *fic_entree="saisie.txt";
char fic_sortie[LEN],*p;
FILE *f1,*f2;
float x;
// On fabrique le nom du fichier de sortie : // ==> remplacement de ".txt" par ".dat"
// 1) recopie du nom de fichier sprintf(fic_sortie,"%s",fic_entree);
// 2) pointeur sur le caractere '.' p=fic_sortie+strlen(fic_sortie)-4;
// 3) remplacement de l'extension sprintf(p,"%s",".dat");
// 4) vérification
printf("fic_sortie=\"%s\"\n",fic_sortie);
f1=fopen(fic_entree,"rt");
// On vérifie si f1!=NULL if (f1==NULL) {
printf("Impossible d'ouvrir le fichier \"%s\"\n",fic_entree);
return 0;
}
f2=fopen(fic_sortie,"wb");
// On vérifie si f2!=NULL if (f2==NULL) {
printf("Impossible d'ouvrir le fichier \"%s\"\n",fic_sortie);
return 0;
}
// On continue tant que scanf réussi à convertir un float while (fscanf(f1,"%f",&x)==1) {
if (fwrite(&x,sizeof(x),1,f2)!=1) {
printf("Impossible d'eccrire dans le fichier \"%s\"\n",fic_sortie);
break;
} }
// On ferme les fichiers fclose(f1);
fclose(f2);
return 0;
}
Exercice 3 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100 int main() {
char nom_fic[LEN],*p;
do {
printf("Donnez un nom de fichier texte : ");
fgets(nom_fic,LEN-4,stdin);
nom_fic[strlen(nom_fic)-1]='\0'; // on retire '\n'
// On recherche le caractere '.' caracteristique d'une extension p=strchr(nom_fic,'.');
// Si p est NULL ==> le nom n'a pas d'extension.
// ==> on peut ajouter l'extension ".txt"
if (p==NULL) {
sprintf(nom_fic,"%s.txt",nom_fic);
}
// On recherche l'extension ".txt"
p=strstr(nom_fic,".txt");
// Si p n'est pas NULL ==> la chaine ".txt" a été trouvée dans nom_fic.
// On peut vérifier si ".txt" se situe bien en fin de chaine if (p!=NULL && (strlen(nom_fic)-(p-nom_fic))==4) break;
printf("Nom de fichier incorrect. Recommencez\n");
} while (1); // Boucle infinie
printf("\nLe nom de fichier est : \"%s\"\n\n",nom_fic);
return 0;
}