/*************************************** * * * Copyright (c) 1998 Jean-Eric Pin * * All rights reserved. * * * * TAB = 2 spaces * * * ***************************************/ /*------------------------------------------------------------------- * * FichierUnix.c OK * *------------------------------------------------------------------- */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include "Erreurs.h" #include "Main.h" #include "Espace.h" #include "FichierUnix.h" #include "Globales.h" #include "Initialisation.h" #include "Memoire.h" #include "Utilitaires.h" #if SYSTEME == MAC #include <unix.h> #endif extern float Version; extern numero TailleMaxi, NbElements; extern unsigned short NbLettres, TypeCalcul, TypeSemigroupe, SemigroupeRenverse, InitiauxASpecifer, FinauxASpecifer, PartiePointee, MemoireAllouee; extern unsigned long TailleTableDeHachage, TailleTableDeHachageMoinsUn; extern char **Messages; extern char NomExemple[255]; extern char DirExemples[255]; extern Sauvegarde_ Sauvegarde; extern Lecture_ LectureFichier; /************************************************** * * ChoixNom * **************************************************/ void ChoixNomExemple() { char Nom[LONGUEUR_NOM]; int erreur; printf("%s ", Messages[M_Give_name_file]); /* printf("Donnez le nom du fichier : "); */ if (scanf("%s", Nom) == EOF) { erreur = errno; Erreur_scanf(erreur); printf("scanf error\n"); exit(1); } strcpy(NomExemple, DirExemples); strcat(NomExemple, Nom); } /************************************************** * * Ouverture : Ouverture d'un fichier par fopen. * **************************************************/ FILE *Ouverture(const char *Nom, const char *mode) { FILE *fichier; /* Fichiers KR p.158 */ int erreur; fichier = fopen(Nom, mode); if (fichier == 0) { erreur = errno; Erreur_fopen(erreur); printf("%s %s !\n", Messages[M_Pb_opening], Nom); /* printf("Probleme a la creation de %s !\n", nom); */ return 0; } return(fichier); } /************************************************** * * Fermeture : Fermeture d'un fichier par fclose. * **************************************************/ void Fermeture(FILE *fichier) { int erreur; int retour = fclose(fichier); if (retour != 0) { erreur = errno; Erreur_fclose(erreur); printf("%s\n", Messages[M_Pb_closure]); /* printf("Probleme a la fermeture d'un fichier !\n"); */ } } /************************************ * * DialogueSauvegardeFichier. * ************************************/ void DialogueSauvegardeFichier() { FILE *fichier; /* Fichiers KR p.158 */ int erreur; do { ChoixNomExemple(); fichier = Ouverture(NomExemple, "w"); } while (!fichier); if (fprintf(fichier, "%8f %% Version de Semigroupe\n", Version) < 0) { erreur = errno; printf("fprintf %8f %% Version de Semigroupe failed!\n", Version); Erreur_printf(erreur); return; } if (fprintf(fichier, "%8lu %% Taille maximum\n", TailleMaxi) < 0) { erreur = errno; printf("fprintf %8lu %% Taille maximum failed!\n", TailleMaxi); Erreur_printf(erreur); return; } if (fprintf(fichier, "%8d %% Type de calcul\n", TypeCalcul) < 0) { erreur = errno; printf("fprintf %8d %% Type de calcul failed!\n", TypeCalcul); Erreur_printf(erreur); return; } if (fprintf(fichier, "%8d %% Type de semigroupe\n", TypeSemigroupe) < 0) { erreur = errno; printf("fprintf %8d %% Type de semigroupe failed!\n", TypeSemigroupe); Erreur_printf(erreur); return; } if (fprintf(fichier, "%8d %% Partie pointee ?\n", PartiePointee) < 0) { erreur = errno; printf("fprintf %8d %% Partie pointee ? failed!\n", PartiePointee); Erreur_printf(erreur); return; } if (PartiePointee) { if (fprintf(fichier, "%8d %% Initiaux specifies\n", InitiauxASpecifer) < 0) { erreur = errno; printf("fprintf %8d %% Initiaux specifies failed!\n", InitiauxASpecifer); Erreur_printf(erreur); return; } if (fprintf(fichier, "%8d %% Finaux specifies\n", FinauxASpecifer)< 0) { erreur = errno; printf("fprintf %8d %% Finaux specifies failed!\n", FinauxASpecifer); Erreur_printf(erreur); return; } } if (fprintf(fichier, "%8d %% Semigroupe renverse ?\n", SemigroupeRenverse) < 0) { erreur = errno; printf("fprintf %8d %% Semigroupe renverse failed!\n", SemigroupeRenverse); Erreur_printf(erreur); return; } if (fprintf(fichier, "%8d %% Nombre de generateurs\n", NbLettres) < 0) { erreur = errno; printf("fprintf %8d %% Nombre de generateurs failed!\n", NbLettres); Erreur_printf(erreur); return; } Sauvegarde(fichier); Fermeture(fichier); } /************************************ * * LectureExemple. * ************************************/ void LectureExemple(FILE *fichier) /* Fichiers KR p.158 */ { char buffer[TAILLE_BUFFER]; int erreur; fgets(buffer, TAILLE_BUFFER, fichier); /* Version ignoree pour l'instant */ if (fscanf(fichier, "%ld %% Taille maximum", &TailleMaxi) != 1) { printf("scanf error\n"); exit(1); } if (fscanf(fichier, "%hd %% Type de calcul", &TypeCalcul) != 1) { printf("scanf error\n"); exit(1); } if (fscanf(fichier, "%hd %% Type de semigroupe", &TypeSemigroupe) != 1) { printf("scanf error\n"); exit(1); } if (fscanf(fichier, "%hd %% Partie pointee ?", &PartiePointee) != 1) { printf("scanf error\n"); exit(1); } if (PartiePointee) { if (fscanf(fichier, "%hd %% Initiaux specifies", &InitiauxASpecifer) != 1) { printf("scanf error\n"); exit(1); } if (fscanf(fichier, "%hd %% Finaux specifies\n", &FinauxASpecifer) != 1) { printf("scanf error\n"); exit(1); } } if (fscanf(fichier, "%hd %% Semigroupe renverse ?", &SemigroupeRenverse) != 1) { printf("scanf error\n"); exit(1); } if (fscanf(fichier, "%hd %% Nombre de generateurs", &NbLettres) != 1) { printf("scanf error\n"); exit(1); } Choix(); LectureFichier(fichier); TailleTableDeHachage = EstimationTailleTableDeHachage(TailleMaxi + 1); TailleTableDeHachageMoinsUn = TailleTableDeHachage - 1; Fermeture(fichier); } /************************************ * * ModificationFichier. * ************************************/ void ModificationFichier(FILE *fichier) /* Fichiers KR p.158 */ { char buffer[TAILLE_BUFFER]; long n; int erreur; fgets(buffer, TAILLE_BUFFER, fichier); n = ftell(fichier); rewind(fichier); fseek(fichier, n, SEEK_SET); if (fprintf(fichier, "%8lu %% Taille maximum\n", NbElements) < 0) { erreur = errno; printf("fprintf %8lu %% Taille maximum failed!\n", NbElements); Erreur_printf(erreur); return; } Fermeture(fichier); }