lordankou | bon voila pour résumer : le sujet : Spécification Externe :
Etant donné un fichier dont les lignes sont organisées comme suit :
- 1ere ligne : identite d'un joueur de foot
- 2eme ligne : identite du club de ce joueur
- 3eme ligne : identite d'un joueur de foot
- 4eme ligne : identite du club de ce joueur
Ecrire un programme qui prendra en paramètre le nom du fichier
contenant les joueurs et le nom du fichier résultat dans lequel on
mettra sur chaque ligne le joueur associé à son club.
Spécification Interne :
1/ Stratégie
--> on supposera que tous les joueurs ont un club et que chaque club à
un joueur. cela veut donc dire qu'il y a un nombre pair de ligne
et que chaque ligne contient un nom de joueur ou un club. (ce
n'est pas au programme de gérer les erreurs dans le fichier de données)
nb_ligne : comptera le nombre de ligne lue et init à 0
la fonction main prendra en paramètre deux noms de fichiers (sur 10
caractère) qui seront le fichier de donnée (nom_donnees) et le fichier
resultat (nom_resultat).
ensuite :
les fonctions ci dessous ne se dérouleront que si argc = 3 sinon on ne
fait rien
ouverture du fichier nom_donnees en lecture seule. (fd)
ouverture du fichier nom_resultat en création. (fr)
si fd < 0 alors
afficher le message ("erreur : fichier non existant. impossible de l'ouvrir" );
retourne (-fd) et sortir du programme
si fr < 0 alors
afficher le message ("erreur : fichier déjà existant." );
retourne (-fr) et sortir du programme
sinon
boucle
lire la première ligne -> nom_joueur
nb_ligne ++
lire la seconde ligne -> nom_club nb_ligne ++
si nom_joueur & nom_club > 0 alors faire concaténer nom_joueur + nom_club -> nom_joueur_club
enregistrer nom_joueur_club si nom_joueur & nom_club < 0 et (nb_ligne mod 2) = 0 alors faire
sortir de la boucle et retourner 0
si nom_joueur & nom_club < 0 et (nb_ligne mod 2) != 0 alors faire
afficher un message d'erreur ("Structure du fichier non valide" )
retourner (-nb_ligne);
sortir de la boucle
fin de si
fin de boucle
fin de si
2/ Elements
nom_donnes : char [10] -> nom du fichier données
nom_resultat : char [10] -> nom du fichier résultat
fd, fr : variable entière initialisé à 0 nom_joueur : char [30] -> variable pour la lecture du nom du joueur nom_club : char [30] -> variable pour la lecture du nom du club
nom_joueur_club : char [60] -> variable contenant le nom du joueur et
son club
nb_ligne : nombre de ligne depuis le début du fichier et initialisé à 0
le programme :
Code :
- /* POUR PLUS D'INFORMATION CONSULTER LE README */
- /* déclaration des bibliotèques */
- #include <stdio.h> // opérations d'entrées sorties
- #include <unistd.h> // opérations sur les fichiers
- #include <fcntl.h> // pour O_RDONLY
- #include <string.h> // pour strcat
- int main(int argc, char *argv[])
- {
- /* Déclaration des variables */
-
- int fd = 0, fr = 0 ; // variable entière initialisé à 0
- char carlu [1] = ""; // caractère lu
- char nom_joueur [30] ="" ; // variable pour la lecture du nom du joueur
- char nom_club [30] = ""; // variable pour la lecture du nom du club
- char nom_joueur_club [60] ; // variable contenant le nom du joueur et son club
- int nb_ligne = 0 ; // nombre de ligne depuis le début du fichier et initialisé à 0
- int nb_joueur, nb_club ; // variable contenant la longueur de la chaine
- /* vérifie si il y a 3 paramètre sinon on sort */
- if (argc != 3) { printf("\nSyntaxe non valide. TP3 fichier_de_donnes fichier_resultat\n" ); return argc ; }
- /* ouverture des fichiers */
- fd = open (argv[1], O_RDONLY);
- fr = open(argv[2], O_CREAT | O_RDWR, 0777);
- /* verifie les fichier */
- if (fd < 0) { printf("\nerreur : fichier non existant. impossible de l'ouvrir.\n" ) ; // fichier non existant
- return(-fd); // fin du programme
- }
- if (fr < 0) { printf("\nerreur : fichier déjà existant.\n" ) ; // fichier non existant
- return(-fr); // fin du programme
- }
- /* traiter le fichier */
- do
- {
- /* lecture d'un joueur dans le fichier */
- do
- {
- nb_joueur = read(fd, carlu, 1); // lecture caractère par caractère
- strcat(nom_joueur, carlu);
- } while (carlu != "\n" ); // on sort à la fin de la ligne
- nb_ligne ++ ;
- /* lecture d'un club dans le fichier club */
- do
- {
- nb_club = read(fd, carlu, 1);
- strcat(nom_club , carlu);
- } while (carlu != "\n" );
- nb_ligne ++ ;
- /* cas ou la structure du fichier n'est pas respecté on l'indique */
- if ((nb_joueur > 0) & (nb_club > 0) & ((nb_ligne % 2)!=0)) { printf("\nStructure du fichier non valide\n" );
- return(-nb_ligne); // fin du programme
- }
-
- /* concatenation */
- strcat(nom_joueur_club, nom_joueur) ;
- strcat(nom_joueur_club, nom_club);
- strcat(nom_joueur_club, "\n" );
- /* ecriture dans le fichier resultat */
- write(fr, nom_joueur_club, nb_joueur+nb_club);
- } while ((nb_joueur > 0) & (nb_club > 0) & ((nb_ligne % 2)==0));
- close(fr);
- close(fd);
- return(0); // retourne 0 si le programme c'est bien terminé
- }
|
et l'erreur :
quand je lance le prg avec par exemple :
TP3 donne resultat
avec donne contenant des valeurs il me retourne segmentation fault
et ensuite le problème (pendant un temps ça a marché...) c qu'il ne trouve pas le caractère de "\n" à la fin de chaque ligne lu. |