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 :

Lecture fichier (acces direct)


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Lecture fichier (acces direct)
    Bonjour à tous,

    J'ai des petits problèmes pour lire mon fichier en accès direct, c'est a dire sélectionner un contact parmi le total dans mon fichier..

    Voici mon code pour pour l'écriture et lecture du fichier sequentiel qui marche très bien :

    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
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
     
    void partie1Saisie() // Appel de la saisie partie 1
    {
    	system("cls"); // On éfface l'écran
     
    	// On présente ici l'exercice
    	printf("________________________________________________\n"
    			"Partie 1 - Fichier sequentiel :\n"
    			"------------------------------------------------\n"
    			"Saisir et enregistrer\n"
    			"------------------------------------------------\n\n");
     
    	// Déclaration & Initialisation des variables
    	annuaire UnAnnuaire = {"", "", 0, 0}; // On initialise l'instanciation de struct annuaire
    	char ajoutContact = NULL;
    	char initAnnuaire = NULL;
    	int lignesFichier = 0; // Compteur lignes du fichier
     
    // DEBUT
    	printf("Souhaitez vous initialiser l'annuaire ? -> [i]\nAppuyer sur une touche pour continuer..\n\n Votre choix : ");
    	fflush(stdin); // On vide le flux
    	scanf("%c", &initAnnuaire);
     
    	if (initAnnuaire == 'i')
    	{
    		/* On compte le nombre de lignes total que contient le fichier,
    		on ferme et on réouvre pour saisir les chaines */
    		f = fopen("fichiers\\annuaire.txt", "w+"); // Ouverture et initialisation
    		lignesFichier = nb_lignes (f); // Compte le nombre de lignes du fichier
    		fclose(f); // On ferme
     
    		f = fopen("fichiers\\annuaire.txt", "w+"); // Ouverture en écriture + initialisation
    		// Le pointeur "f" devient alors un pointeur sur "annuaire.txt"
     
    		printf("\n	**  Annuaire initialise  **\n\n"
    			   "Contacts (%d)\n", lignesFichier);
    	}
    		else
    		{	
    			/* On compte le nombre de lignes total que contient le fichier,
    			on ferme et on réouvre pour saisir les chaines */
    			f = fopen("fichiers\\annuaire.txt", "r"); // Ouverture en mode lecture "read"
    			lignesFichier = nb_lignes (f); // Compte le nombre de lignes du fichier
    			fclose(f); // On ferme
     
    			f = fopen("fichiers\\annuaire.txt", "a"); // Ouverture en écriture ajout (append)
     
    			printf("\n	**  Ouverture de l'annuaire en mode append (ajout) **\n\n"
    				   " Contacts (%d)\n", lignesFichier);
    		}
    	printf("------------------------------------------------\n\n");
     
    	if (f != NULL) // On verifie bien que le fichier a été crée
    	{
    		nouveauContact_P1(lignesFichier);
     
    		printf("\n\nAjouter un contact a l'annuaire -> [a]\nAppuyer sur une touche pour continuer..\n\n Votre choix : ");
    		fflush(stdin); // On vide le flux
    		scanf("%c", &ajoutContact);
    		printf("------------------------------------------------\n\n");
     
    		while (ajoutContact == 'a')
    		{
    			lignesFichier++; // On ajoute 1 au compteur de lignes
    			nouveauContact_P1(lignesFichier);
     
    			printf("\n\nAjouter un contact a l'annuaire -> [a]\nAppuyer sur une touche pour continuer..\n\n Votre choix : ");
    			fflush(stdin); // On vide le flux
    			scanf("%c", &ajoutContact);
    			printf("------------------------------------------------\n\n");
    		}
    		fclose(f); // Fermeture du fichier
    	}
    		else
    		{
    			printf("Impossible d'ouvrir le fichier");
    		}
     
    // FIN
    }
     
    void partie1Lire() // Appel de la lecture partie 1
    {
    	system("cls"); // On éfface l'écran
     
    	// On présente ici l'exercice
    	printf("________________________________________________\n"
    			"Partie 1 - Fichier sequentiel :\n"
    			"------------------------------------------------\n"
    			"Lecture du fichier\n"
    			"------------------------------------------------\n\n");
     
    	// Déclaration & Initialisation des variables
    	annuaire UnAnnuaire;
    	#define TAILLE_MAX 50 // On définit la taille max de la chaine de caractère
    	char *pointeur = NULL;
    	char *separateur = { ";;" }; // Definition du séparateur
    	char *buffer = NULL;
    	int i=1;
    	int lignesFichier = 0; // Compteur lignes du fichier
    	char chaine[TAILLE_MAX] = ""; // Tableau pour recevoir la chaine complete du fichier
    	char *Chaine_Entrante=("%s",chaine); // On copie la chaine de caractère pour la traité
    	// Tableaux pour recevoir la valeur de chaques elements de la chaine complete
    	char nom[21];
        char numeroTel[16];
    	char age[4];
    	char numeroC[5]; // recupere le numero du contact
     
    // DEBUT
     
    	 /* On compte le nombre de lignes total que contient le fichier,
    	on ferme et on réouvre au debut pour traiter les chaines */
        f = fopen("fichiers\\annuaire.txt", "r"); // Ouverture en mode lecture "read"
    	lignesFichier = nb_lignes (f); // Compte le nombre de lignes du fichier
    	fclose(f); // On ferme
    	f = fopen("fichiers\\annuaire.txt", "r"); // On réouvre en read
     
        if (f != NULL)
        {
    		printf("                   ** Annuaire **\n"
    				"------------------------------------------------\n"
    				"_____Contacts : %d\n\n"
    				"_Nom :\t\t\tAge :\tNumero de telephone :\tNumero du contact :\n\n", lignesFichier);
     
            while (fgets(chaine, TAILLE_MAX, f) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
            { 
    			buffer = strdup ( Chaine_Entrante ); // Duplique la chaine de caractère
     
    			// Premier appel
    			pointeur = strtok( buffer, separateur ); // Coupe la chaine de caractère au niveau du séparateur
    			strcpy(nom, pointeur); // Copie le dans le tableau nom
     
    			while( pointeur != NULL )
    			{
    				// Cherche les autres separateur
    				pointeur = strtok( NULL, separateur ); // On coupe la chaine de caractère tant qu'on ne reçoit pas d'erreur (NULL)
     
    				if ( pointeur != NULL )
    				{
    					 i++;
    					 if ( i == 2 )
    					 {
    						strcpy(age, pointeur); // Copie l'age dans le tableau age
    					 }
    						if ( i == 3 ) 
    						{
    							 strcpy(numeroTel, pointeur); // Copie le numero de tel. dans le tableau numeroTel
    						}
    				if ( i == 4 ) 
    				{
    					strcpy(numeroC, pointeur); // Copie le numero du contact dans le tableau numeroC
    					// On gere l'affichage correctement en fonction de la longueur du nom
    					 if (strlen(nom) < 8)
    					 {
    						 printf("%s\t\t\t%s\t%s\t\t-> %s", nom, age, numeroTel, numeroC); // On affiche la chaine du contact
    					 }
    						else if ((strlen(nom) >= 8) && (strlen(nom) < 16))
    						{
    							printf("%s\t\t%s\t%s\t\t-> %s", nom, age, numeroTel, numeroC);
    						}
    							else
    							{
    								printf("%s\t%s\t%s\t\t-> %s", nom, age, numeroTel, numeroC);
    							}
    					i = 1; // On réinitialise i à 1 (car 4 elements dans une chaine de caractères)
    				}	
    				} 
    			}
            }
            fclose(f);
    	}
    		else
    		{
    			printf("Impossible d'ouvrir le fichier");
    		}
     
    // FIN
    }
    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
     
    /*___________________________________________________________________________________________*/
    /*________________________________FONCTIONS SECONDAIRES_____________________________________*/
     
     
    void nouveauContact_P1(int lignesFichier)
    {
    	// Declaration & Initialisation des variables
    	//char age[10]; // variable permettant de transtyper l'age dans une chaine de caractère
    	annuaire UnAnnuaire;
     
    // DEBUT
    	lignesFichier++; // On ajoute 1 au compteur de lignes
    	printf("_____________Nouveau Contact -> c%d\n\n", lignesFichier);
     
    	// Saisie du NOM
    	while (strlen(UnAnnuaire.Nom) > 20) // Calcule la longueur de la chaine
    	{
    		printf("\nNom (max 20 caracteres) : ");
    		scanf("%s", UnAnnuaire.Nom);
    		if (strlen(UnAnnuaire.Nom) > 20)
    		{
    			printf("\n*Format incorrect, ressaisisez : ");
    		}
     
    	}	
    	printf("                         -----------------------\n");
     
    	// Saisie de l'AGE
    	printf("Age : ");
    	/* On sécurise la saisie contre les caractères, et les nombres iréels
    	on vérifie si scanf renvoie bien un nombre */
    	while ((scanf("%d", &UnAnnuaire.Age) <= 0) || ((UnAnnuaire.Age > 150) || (UnAnnuaire.Age <= 0)))
    	{
    		/* On indique à l'utilisateur que la saisie n'est pas correct 
    		puis on redemande la saisie tant que la condition n'est pas remplie */
    		if ((scanf("", &UnAnnuaire.Age) <= 0) || ((UnAnnuaire.Age > 150) || (UnAnnuaire.Age <= 0)))
    		{
    			printf("\n*Format incorrect, ressaisisez : "
    					"\nAge : ");
    		}
     
    		// Si ce n'est pas le cas, on vide le buffer, et on redemande avec la boucle while
    		purger();
    	}
    	printf("     ---\n");
     
    	//sprintf(age, "%d", UnAnnuaire.Age); // Transtype Age de UnAnnuaire dans une chaine de caractère 'age'
     
    	// Saisie du NUMERO DE TELEPHONE
    	while ((strlen(UnAnnuaire.NumeroTel) > 14) || (strlen(UnAnnuaire.NumeroTel) < 14)) // Calcule la longueur de la chaine
    	{
    		printf("Numero de telephone (xx-xx-xx-xx-xx) : ");
    		fflush(stdin); // On vide le flux
    		scanf("%s", UnAnnuaire.NumeroTel);
     
    		if ((strlen(UnAnnuaire.NumeroTel) > 14) || (strlen(UnAnnuaire.NumeroTel) < 14))
    		{
    			printf("\n*Format incorrect, ressaisisez : \n");
    		}
     
    	}	
    	printf("                                      --------------\n");
    	UnAnnuaire.numeroContact = lignesFichier; // On affecte la valeur de lignesFichier au numeroContact
     
    	// On copie dans le fichier avec le numero de la ligne correspondant
    	fprintf(f,"%s;;%d;;%s;;c%d\n", UnAnnuaire.Nom, UnAnnuaire.Age, UnAnnuaire.NumeroTel, UnAnnuaire.numeroContact); 
     
    // FIN
    }
    J'aurais besoin de conseils sur les fonctions a utiliser, pour sélectionner une ligne spécifique dans mon fichier. Je trouve pas mon bonheur sur le net..

    De plus j'aimerais savoir comment faire des enregistrements de taille fixe, cela me pose des problèmes après pour l'affichage.

    Merci

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Lorsque initAnnuaire == 'i', que signifie le fopen("fichiers\\annuaire.txt", "w+") suivi d'un nb_lignes(f) juste après alors que le mode "w+" a pour effet de créer un fichier vide ? (si nb_lignes fait bien ce que son nom suggère) - Ensuite tu fermes le fichier et l'ouvres à nouveau avec le même mode. C'est bizarre tout ça. Et de toute façon il y a freopen si tu veux réouvrir un flux au lieu de faire un fclose suivi de fopen. Dans le else, tu peux aussi ouvrir simplement le fichier en mode "a+" au lieu d'ouvrir dans un premier temps en "r" et ensuite en "a". Bon voilà c'était juste une remarque.

    J'aurais besoin de conseils sur les fonctions a utiliser, pour sélectionner une ligne spécifique dans mon fichier. Je trouve pas mon bonheur sur le net..
    Lire toutes les lignes précédant celles que tu veux atteindre et il n'y a pas d'autre moyen, à part parcourir tout le fichier et sauvegarder toutes les positions de début de ligne pour pouvoir se déplacer dans le fichier à l'aide des fonctions de positionnement (fseek, fsetpos, etc.).

    De plus j'aimerais savoir comment faire des enregistrements de taille fixe, cela me pose des problèmes après pour l'affichage.
    fwrite(&UnAnnuaire, sizeof(UnAnnuaire), 1, f). Ton fichier devient alors "binaire" et non plus "texte".

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/03/2010, 08h17
  2. [Fortran 77] Fichier à accès direct
    Par ERICKO dans le forum Fortran
    Réponses: 15
    Dernier message: 31/03/2009, 14h01
  3. Fichier acces direct et sequentiel
    Par malav dans le forum C
    Réponses: 4
    Dernier message: 29/01/2009, 16h09
  4. Réponses: 7
    Dernier message: 18/03/2006, 13h16
  5. Probleme lecture fichier acces sequentiel
    Par ouar dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/09/2005, 13h39

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