IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lire un fichier (separateur)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Lire un fichier (separateur)
    Bonjour je développe un annuaire de saisie du nom âgé et numéro de téléphone dans un fichier. Jusque pas de problèmes mais je n'arrive pas à en faire la lecture correct.

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
     
    FILE* f = NULL; // Creation d'un fichier global
     
    // Définition d'une structure en globale
    typedef struct annuaire annuaire; // Le programme reconnaitra directement annuaire comme une structure
     
    struct annuaire{
        char Nom[21];
        char NumeroTel[15]; // On ajoute +1 pour le caractère d'échappement '/0'
    	int Age;
    };
     
     
    void partie1Saisie() // Appel de la saisie partie 1
    {
    	system("cls"); // On éfface l'écran
     
    	// On présente ici l'exercice
    	printf("________________________________________________\n");
    	printf("Partie 1 - Fichier sequentiel :\n");
    	printf("------------------------------------------------\n");
    	printf("Saisir et enregistrer\n");
    	printf("------------------------------------------------\n\n");
     
    	// Déclaration & Initialisation des variables
    	annuaire UnAnnuaire = {"", "", 0}; // On initialise l'instanciation de struct annuaire
    	char ajoutContact = NULL;
    	char initAnnuaire = NULL;
     
    // DEBUT
    	printf("Souhaitez vous initialiser l'annuaire ? [i]\nSaisissez une touche pour continuer..\n\n Votre choix : ");
    	fflush(stdin); // On vide le flux
    	scanf("%c", &initAnnuaire);
    	if (initAnnuaire == 'i')
    	{
    		printf("\n	**  Annuaire initialise  **\n\n");
    	}
    		else
    		{
    			printf("\n	**  Ouverture de l'annuaire en mode append (ajout)  **\n\n");
    		}
    	printf("------------------------------------------------\n\n");
     
    	if (initAnnuaire == 'i')
    	{
    		f = fopen("fichiers\\annuaire.txt", "w+"); // Ouverture en écriture + initialisation
    		// Le pointeur "f" devient alors un pointeur sur "annuaire.txt"
    	}
    		else
    		{
    			f = fopen("fichiers\\annuaire.txt", "a"); // Ouverture en écriture ajout (append)
    		}
     
    	if (f != NULL) // On verifie bien que le fichier a été crée
    	{
    		nouveauContact();
     
    		printf("\n\nAjouter un contact a l'annuaire [o]\nSaisissez une touche pour continuer..\n\n Votre choix : ");
    		fflush(stdin); // On vide le flux
    		scanf("%c", &ajoutContact);
    		printf("------------------------------------------------\n\n");
     
    		while (ajoutContact == 'o')
    		{
    			nouveauContact();
     
    			printf("\n\nAjouter un contact a l'annuaire [o]\nSaisissez une touche pour continuer..\n\n Votre choix : ");
    			fflush(stdin); // On vide le flux
    			scanf("%c", &ajoutContact);
    			printf("------------------------------------------------\n\n");
    		}
    	}
    		else
    		{
    			printf("Impossible d'ouvrir le fichier");
    		}
     
    	fclose(f); // Fermeture du fichier
     
    // FIN
    }
     
     
    void nouveauContact() // "void partie1Saisie();"
    {
    	// Declaration & Initialisation des variables
    	//char age[10]; // variable permettant de transtyper l'age dans une chaine de caractère
    	annuaire UnAnnuaire;
     
    // DEBUT
    	printf("_____________Nouveau Contact : \n\n");
     
    	// Saisie du NOM
    	printf("\nNom (max 20 caracteres) : ");
    	scanf("%s", UnAnnuaire.Nom);
    	printf("                         --------------------\n");
     
    	// Saisie de l'AGE
    	printf("Age : ");
    	scanf("%d", &UnAnnuaire.Age);
    	printf("     ---\n");
     
    	//sprintf(age, "%d", UnAnnuaire.Age); // Transtype Age de UnAnnuaire dans une chaine de caractère 'age'
     
    	// Saisie du NUMERO DE TELEPHONE
    	printf("Numero de telephone (xx-xx-xx-xx-xx) : ");
    	scanf("%s", UnAnnuaire.NumeroTel);
    	printf("                                     --------------\n");
     
    	fprintf(f,"%s;;%d;;%s\n", UnAnnuaire.Nom,  UnAnnuaire.Age, UnAnnuaire.NumeroTel); // On copie dans le fichier
     
    // FIN
    }
    Jusque la l'enregistrement des coordonnées est tres bien enregistrer dans mon fichier.

    C'est la ou sa merde un peu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    void partie1Lire() // Appel de la lecture partie 1
    {
    	system("cls"); // On éfface l'écran
     
    	// On présente ici l'exercice
    	printf("________________________________________________\n");
    	printf("Partie 1 - Fichier sequentiel :\n");
    	printf("------------------------------------------------\n");
    	printf("Lecture du fichier\n");
    	printf("------------------------------------------------\n\n");
     
    	// Déclaration & Initialisation des variables
    	annuaire UnAnnuaire;
    	int lectureok = 0;
     
    // DEBUT
     
        printf("Annuaire : \n\n");
     
        f = fopen("fichiers\\annuaire.txt", "r"); // Ouverture en mode lecture "read"
     
    	printf("Nom			Age		Numero de telephone\n\n");
     
        do
        {
            lectureok=fscanf(f,"%s			%d		%s\n", &UnAnnuaire.Nom, &UnAnnuaire.Age, &UnAnnuaire.NumeroTel);
            if (lectureok==1) printf("%s			%d		%s\n", &UnAnnuaire.Nom, &UnAnnuaire.Age, &UnAnnuaire.NumeroTel);
     
        } while (lectureok==1);
     
        fclose(f); // Fermeture du fichier
     
    // FIN
    }
    La lecture s'effectue, mais j'obtiens ma chaine de caractère complète dès le premier "%s" et j'aimerais que ce soit bien séparer, je ne trouve pas comment crée ma fonction séparateur ";;".

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Salut!

    Tu peux tout a fait envisager de lire ton fichier a coup de fscanf comme tu l'a fait.
    Il te faut simplement les bons argument. Il me semble que cette fonction propose un argument du style [^;] pour lire jusqu'au caractère voulu... a vérifier...

    Au pire tu lit avec fscanf("%s",...) et tu coupe a coup de STRTOK.

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    De plus fscanf te retourne le nombre de champs lus. Dans ton cas, si les 3 champs ont été correctement lus, alors le retour dans lectureok sera 3 et non 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (lectureok>=3)
      printf("%s %d %s\n", &UnAnnuaire.Nom, &UnAnnuaire.Age, &UnAnnuaire.NumeroTel);
    A lire absolument; c'est le man de scanf car c'est une fonction vraiment "dangereuse" si tous n'est pas testé, notamment avec chaines de caractères.
    Je ne serai que trop te conseiller d'utiliser la fonction fgets, et faire toi même l'analyse de la ligne du fichier.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci bien,

    j'ai réussi a faire fonctionner mon bout de code que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    	// Déclaration & Initialisation des variables
    	annuaire UnAnnuaire;
    	#define TAILLE_MAX 21+15+3+4
    	char *pointeur = NULL;
    	char *separateur = { ";;" }; // Definition du séparateur
    	char *buffer = NULL;
    	int i=1; 
    	char chaine[TAILLE_MAX] = ""; // Tableau pour recevoir la chaine complete du fichier
    	// Tableaux pour recevoir la valeur de chaques elements de la chaine complete
    	char nom[21];
        char numeroTel[16]; // On ajoute +1 pour le caractère d'échappement '/0'
    	char age[4];
     
    // DEBUT
     
        f = fopen("fichiers\\annuaire.txt", "r"); // Ouverture en mode lecture "read"
     
        if (f != NULL)
        {
    		printf("                   ** Annuaire **\n"
    				"------------------------------------------------\n"
    				"_____Contacts :\n\n"
    				"_Nom :\t\t\tAge :\t\t\tNumero de telephone : \n\n");
     
            while (fgets(chaine, TAILLE_MAX, f) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            {
    			char *Chaine_Entrante=("%s",chaine);
    			buffer = strdup ( Chaine_Entrante );
     
    			// Premier appel
    			pointeur = strtok( buffer, separateur );
    			strcpy(nom, pointeur);
     
    			while( pointeur != NULL )
    			{
    				// Cherche les autres separateur
    				 pointeur = strtok( NULL, separateur );
     
    				if ( pointeur != NULL )
    				{
    					 i++;
    					 if ( i == 2 )
    					 {
    						strcpy(age, pointeur);
    					 }
    						else 
    						{
    							 strcpy(numeroTel, pointeur);
    							 i = 1; // On réinitialise i à 1
    							  printf("%s\t\t\t%s\t\t\t%s",nom, age, numeroTel); // On affiche la ligne du contact
    						}
    				} 
    			}
            }
            fclose(f);
    	}
    		else
    		{
    			printf("Impossible d'ouvrir le fichier");
    		}
    Le petit truc c'est que j'aimerais que l'affichage des lignes se fassent bien alignés, propre.
    Parcque la c'est tous décallé en fonction du nombre de caractères dans mes chaines.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Servlet][EJB]lire un fichier à partir de mon bean
    Par kimausoleil dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/02/2004, 14h26
  2. [MFC] lire un fichier en int
    Par Kevgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 09h32
  3. Réponses: 5
    Dernier message: 11/01/2004, 20h17
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 14h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 09h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo