#define _C_td6 /* * ---------------------------------------------------------------------------- * * Fichier : td6.c * Langage : C ANSI * Auteur : P. Dechamboux * Creation : 7 novembre 1995 * ---------------------------------------------------------------------------- * Description : * Permet de stocker et relire les carres des 100 premiers entiers dans * (respectivement a partir) de fichiers. On utilise pour cela le module * "td6_carre" qui implante la machine "carre". * ---------------------------------------------------------------------------- * Interventions * >>>>>>>>>>>>> * ---------------------------------------------------------------------------- * Fonctions definies * Locales : LireNomFichier, * Exportees : main. * * ---------------------------------------------------------------------------- */ /****************************************************************************/ /*------------------- INCLUSION DES INTERFACES SYSTEMES --------------------*/ /****************************************************************************/ #include /****************************************************************************/ /*----------------- INCLUSION DES INTERFACES APPLICATIVES ------------------*/ /****************************************************************************/ #include "td6_carre.h" /****************************************************************************/ /*------------------- CONSTANTES, MACROS & TYPES LOCAUX --------------------*/ /****************************************************************************/ #define NBENTIERS 100 /* nombre d'entiers dont on veut stocker les * carres. */ /****************************************************************************/ /*------------------- SIGNATURES DES FONCTIONS LOCALES ---------------------*/ /****************************************************************************/ static char *LireNomFichier(void); static long StockeP (char *nomf); static long StockeW (char *nomf); static long LireS (char *nomf); static long LireR (char *nomf); /****************************************************************************/ /*------------------- DEFINITIONS DES VARIABLES LOCALES --------------------*/ /****************************************************************************/ /****************************************************************************/ /*------------------- IMPLANTATION DES FONCTIONS LOCALES -------------------*/ /****************************************************************************/ /* * ---------------------------------------------------------------------------- * * Fonction : LireNomFichier * Resultat : char * Nom du fichier. * Parametres : * Nom Type Role * * Description : * Saisie un nom de fichier a la console. * * ---------------------------------------------------------------------------- */ static char * LireNomFichier( void) { # define FTAILLEMAX 128 static char nom[FTAILLEMAX+1]; long i; printf("Entrer un nom de fichier : "); i = 0; fflush(stdin); while ((i < FTAILLEMAX) && (scanf("%c", &(nom[i])) == 1)) { if (nom[i] == '\n') break; else i++; } if (i == FTAILLEMAX) { printf("\nNom trop long !!\n"); return NULL; } nom[i] = '\0'; return &(nom[0]); } /* * ---------------------------------------------------------------------------- * * Fonction : StockeP * Resultat : long Code d'erreur : o = OK, 1 = probleme. * Parametres : * Nom Type Role * nomf char * Nom du fichier pour le stockage. * * Description : * Stocke les carres dans 100 premiers entiers avec les entiers eux-memes * a l'aide de la fonction "fprintf". * * ---------------------------------------------------------------------------- */ static long StockeP( char *nomf) { FILE *descf; long i; if ((descf = fopen(nomf, "w")) == NULL) { printf("Ouverture du fichier \"%s\" impossible !!\n", nomf); perror("Le probleme est : "); return 1; } InitCarre(); for (i = 0; i < NBENTIERS; i++) { fprintf(descf, "%d %d\n", ValEntierCour(), ValCarreCour()); CalcCarreSuiv(); } fclose(descf); return 0; } /* * ---------------------------------------------------------------------------- * * Fonction : StockeW * Resultat : long Code d'erreur : o = OK, 1 = probleme. * Parametres : * Nom Type Role * nomf char * Nom du fichier pour le stockage. * * Description : * Stocke les carres dans 100 premiers entiers avec les entiers eux-memes * a l'aide de la fonction "fwrite". * * ---------------------------------------------------------------------------- */ static long StockeW( char *nomf) { FILE *descf; long i; struct { long entier; long carre; } ss; if ((descf = fopen(nomf, "w")) == NULL) { printf("Ouverture du fichier \"%s\" impossible !!\n", nomf); perror("Le probleme est : "); return 1; } InitCarre(); for (i = 0; i < NBENTIERS; i++) { ss.entier = ValEntierCour(); ss.carre = ValCarreCour(); if (fwrite(&ss, sizeof(ss), 1, descf) != 1) printf("Probleme d'ecriture avec \"fwrite\"\n"); CalcCarreSuiv(); } fclose(descf); return 0; } /* * ---------------------------------------------------------------------------- * * Fonction : LireS * Resultat : long Code d'erreur : o = OK, 1 = probleme. * Parametres : * Nom Type Role * nomf char * Nom du fichier de stockage. * * Description : * Charge et affiche le contenu du fichier ecrit par StockeP. * * ---------------------------------------------------------------------------- */ static long LireS( char *nomf) { FILE *descf; long entier, carre; if ((descf = fopen(nomf, "r")) == NULL) { printf("Ouverture du fichier \"%s\" impossible !!\n", nomf); perror("Le probleme est : "); return 1; } while (fscanf(descf, "%d%d", &entier, &carre) != EOF) printf("Le carre de %d est %d.\n", entier, carre); fclose(descf); return 0; } /* * ---------------------------------------------------------------------------- * * Fonction : LireR * Resultat : long Code d'erreur : o = OK, 1 = probleme. * Parametres : * Nom Type Role * nomf char * Nom du fichier de stockage. * * Description : * Charge et affiche le contenu du fichier ecrit par StockeW. * * ---------------------------------------------------------------------------- */ static long LireR( char *nomf) { FILE *descf; struct { long entier; long carre; } ss; if ((descf = fopen(nomf, "r")) == NULL) { printf("Ouverture du fichier \"%s\" impossible !!\n", nomf); perror("Le probleme est : "); return 1; } while (fread(&ss, sizeof(ss), 1, descf) == 1) printf("Le carre de %d est %d.\n", ss.entier, ss.carre); fclose(descf); return 0; } /****************************************************************************/ /*------------------ IMPLANTATION DES FONCTIONS EXPORTEES ------------------*/ /****************************************************************************/ /* * ---------------------------------------------------------------------------- * * Fonction : main * Resultat : long Code d'erreur commande. * Parametres : * Nom Type Role * * Description : * Point d'entree du programme "td6" obtenu par compilation du fichier * "td6.c" (gcc -o td6 td6.c td6_carre.c). * * ---------------------------------------------------------------------------- */ long main() { printf("Ecriture des carres des %d premiers entiers avec la fonction \"StockeP\"\n", NBENTIERS); StockeP(LireNomFichier()); printf("Ecriture des carres des %d premiers entiers avec la fonction \"StockeW\"\n", NBENTIERS); StockeW(LireNomFichier()); printf("\n\nComparer le contenu des deux fichiers crees soit avec un editeur (vi), soit avec la commande \"more\" ou \"cat\". On constate que le premier fichier cree est lisible car c'est un fichier texte qui ne contient que des code ascii de caracteres affichables. L'autre fichier a un contenu dit \"binaire\" qui contient les donnees dans leur format memoire centrale.\n\n\n"); printf("Lecture du fichier avec la fonction \"LireS\"\n"); LireS(LireNomFichier()); printf("\n\n"); printf("Lecture du fichier avec la fonction \"LireR\"\n"); LireR(LireNomFichier()); printf("\n\n"); printf("Fin du programme.\n"); return(0); }