#include #include #include /* Definition des constantes */ #define ARGUMENT_COMMANDE 5 /* Nombre d argument dans la commande */ #define POSITION_EMETTEUR 2 /* Position de l emetteur dans la commande */ #define POSITION_DESTINATAIRE 3 /* Position du destinataire dans la commande */ #define POSITION_MESSAGE 4 /* Position du message dans la commande */ #define LONGUEUR_LIGNE 255 /* Nombre de caracteres maxi dans une ligne du fichier decrivant le reseau */ #define NOMBRE_LIAISON_MAX 4 /* Nombre de liaisons maximales par noeud */ /* Definitions des structures */ struct message { char *contenu; char *depart; char *arrivee; } message; struct noeud { char *nom; struct noeud *noeud_liaison[NOMBRE_LIAISON_MAX]; } noeud; int main (int argc, char *argv[]) { //On verifie que le nombre d argument est bien egal a 5 if (argc != ARGUMENT_COMMANDE) { puts ("La commande ne comporte pas le nombre d argument requis"); } else { int arret_programme = 1; //Indicateur d arret du programme initialise a " arret " donc VRAI struct noeud *tableau_noeud; //Declaration des variables FILE *pointeur_fichier; //Pointeur servant a l ouverture du fichier de description du reseau char ligne[LONGUEUR_LIGNE]; //Ligne comportant LONGUEUR_LIGNE comme maximum de caracteres int nombre_lignes_lues = 0; //Compteur indiquant le nombre de lignes lues dans le fichier char *nom_noeud; //Pointeur vers le nom d un nom int nombre_ligne = 0; int nombre_noeud = 0; int ligne_noeud = 0; int rangement = 1; //Le nom du fichier a ouvrir est le premier argument de la commande char *fichier_donnee = argv[1]; //L emetteur est le second argument de la commande char *emetteur = argv[POSITION_EMETTEUR]; //Le destinataire est le troisieme argument de la commande char *destinataire = argv[POSITION_DESTINATAIRE]; //Le message est le quatrieme argument de la commande //Message de longueur variable on lui alloue l espace necessaire message.contenu = malloc (strlen (argv[POSITION_MESSAGE])+1); //On verifie l allocation de la memoire if (message.contenu == NULL) { puts ("Allocation memoire pour le message impossible"); } else { //Allocation bien effectuee on remplit la zone memoire avec le message strcpy (message.contenu, argv[POSITION_MESSAGE]); printf ("Message : %s\n", message.contenu); //Indicateur de lancement de programme positionne sur ok arret_programme = 0; } if (!arret_programme) { printf ("Fichier donnee : %s\n", fichier_donnee); printf ("Emetteur : %s\n", emetteur); printf ("Destinataire : %s\n", destinataire); printf ("Message : %s\n", message.contenu); } //Lancement de programme reussi on poursuit l execution while (arret_programme == 0) { //Premiere lecture du fichier afin de recuperer le nombre de lignes lues pointeur_fichier = fopen (fichier_donnee, "r"); //On verifie l ouverture du fichier if (pointeur_fichier == NULL) { puts ("Fichier introuvable"); break; } //On lit le fichier dans le but de recuperer le nombre de ligne lues else { while (fgets (ligne, sizeof ligne, pointeur_fichier), !feof (pointeur_fichier)) { nombre_lignes_lues++; } } //Creation du tableau de pointeur de structure de noeud afin de faciliter la creation du reseau tableau_noeud = malloc (nombre_lignes_lues * sizeof (struct noeud)); if (tableau_noeud == NULL) { puts ("Allocation memoire tableau non reussie"); arret_programme = 1; } //Seconde lecture du fichier afin de creer chaque noeud et determiner le nombre de noeud pointeur_fichier = fopen (fichier_donnee, "r"); if (pointeur_fichier == NULL) { puts ("Fichier introuvable"); break; } else { while (fgets (ligne, sizeof ligne, pointeur_fichier), !feof (pointeur_fichier)) { nom_noeud = strtok (ligne, " "); if (nom_noeud == NULL) { puts ("Ligne vide"); } else { printf ("Nom noeud : %s", nom_noeud); for (nombre_ligne = 0; nombre_ligne < nombre_lignes_lues; nombre_ligne++) { if (strcmp (nom_noeud, (tableau_noeud[nombre_ligne]).nom) == 0) { puts ("Noeud pas unique"); rangement = 0; } } if (rangement == 1) { puts ("Noeud unique\n"); strcpy (tableau_noeud[ligne_noeud].nom, nom_noeud); nombre_noeud++; } } ligne_noeud++; } printf ("Nombre noeud : %d", nombre_noeud); } arret_programme = 1; } } return 0; }