C division d'une chaine, lettre précise

Fermé
jerémiethe7 Messages postés 152 Date d'inscription dimanche 2 décembre 2007 Statut Membre Dernière intervention 27 février 2009 - 20 avril 2008 à 09:51
 amigo - 20 avril 2008 à 15:37
Bonjour,

j'aurais besoin de diviser une chaine en 4 chaines.
Je lis cette grande chaine dans un fichier.txt.
Voici un exemple de mon txt pour mieux comprendre :

0196325874|BARICHELLO|RUBENS|rubens.barichello@honda.jp|
0142536987|BOURDAIS|SEBASTIEN|sebbourdais@estaca.fr|
0159374862|BUTTON|JENSON|jenson.button@honda.jp|
0987321654|HAKKINEN|MIKA|mika_hakkinen@f1.fin|
0963258741|MASSA|FELIPE|felipe.massa@ferrari.it|

en gros une ligne = 4 informations délimitées par des '|'.

J'ai essayé de les extraires, mais sans succès. Voici le code que j'ai fait, il n'est pas optimisé ne fonctionnant pas bien.

int lecture_champs(char *numtel,char *nom,char *prenom,char *email,int taille_totale)
{
char tampon_tel[101],tampon_nom[101],tampon_prenom[101],tampon_mail[101],caractere='0';
int i=0;printf("\n\t\t\t\tNOUVEAU\n");
FILE *repertoire=fopen("Repertoire.txt","r");printf("\t\t\t\t%d entrée\n",taille_totale);
if (repertoire)
{
fseek(repertoire,taille_totale+1,0);
//caractere=fgetc(repertoire); // tel
while (caractere!='|')
{
tampon_tel[i]=caractere;
i++;
caractere=fgetc(repertoire);
}
strcpy(numtel,tampon_tel);i=0;strcpy(tampon_tel,"");
caractere=fgetc(repertoire); // le '|'
printf("%s\n",numtel);
//caractere=fgetc(repertoire); // nom
while (caractere!='|')
{
tampon_nom[i]=caractere;
i++;
caractere=fgetc(repertoire);
}
strcpy(nom,tampon_nom);i=0;strcpy(tampon_nom,"");
//caractere=fgetc(repertoire); // le '|'
printf("%s\n",nom);
caractere=fgetc(repertoire); // prenom
while (caractere!='|')
{
tampon_prenom[i]=caractere;
i++;
caractere=fgetc(repertoire);
}
strcpy(prenom,tampon_prenom);i=0;strcpy(tampon_prenom,"");
//caractere=fgetc(repertoire); // le '|'
printf("%s\n",prenom);
caractere=fgetc(repertoire); // mail
while (caractere!='|')
{
tampon_mail[i]=caractere;
i++;
caractere=fgetc(repertoire);
}tampon_mail[i]='\0';
strcpy(email,tampon_mail);i=0;strcpy(tampon_mail,"");
//caractere=fgetc(repertoire); // le '\n'
printf("%s\n",email);_sleep(5000);
fclose(repertoire);
}
taille_totale+=strlen(numtel)+strlen(nom)+strlen(prenom)+strlen(email)+4;
printf("\t\tsortie %d\n",taille_totale);_sleep(2000);
return taille_totale;
}

Voilà l'appel de cette fonction se fait comme un fscanf. Elle reçoit en argument taille_totale qui correspond au nombre d'octet ou de bits (je ne sais pas torp a vrai dire) qui sera indispensable pour déplacer le curseur de lecture fseek lors du prochain appel. Je ne pense pas qu'on puisse le faire avec un fscanf car des contacts peuvent avoir des noms composés et donc il se peut qu'il y est des espaces.

Voilà je remercie d'avance ceux qui pourront m'aider.
+
A voir également:

1 réponse

Bonjour,

Voici un petit programme qui devrait résoudre ton problème,

Il utilise la fonction strtok() pour extraite les infos contenus dans une chaine et délimités par un séparateur précis.
 #include <string.h>
 #include <stdio.h>
 #include <conio.h>
 #include <stdlib.h>

 int main(void)
 {

 char tampon_tel[101],tampon_nom[101],tampon_prenom[101],tampon_mail[101],input[256];
 char *p;
/* FILE *repertoire=fopen("Repertoire.txt","r");*/
FILE *repertoire = fopen("c:\\test.txt","r");

	 if (repertoire == NULL)
	{
		fprintf (stderr,"\nERREUR D'OUVERTURE DU FICHIER Repertoire.txt\n");
      exit (1);
	}
	while (fgets (input, 256, repertoire) != NULL)
	{
	 /* strtok places a NULL terminator
	 in front of the token, if found */
	 p = strtok(input, "|");
	 if (p)  strcpy(tampon_tel , p);/*  printf("-%s-\n", p);*/

	 /* A second call to strtok using a NULL
	 as the first parameter returns a pointer
	 to the character following the token  */
	 p = strtok(NULL, "|");
	 if (p)  strcpy(tampon_nom , p);/*  printf("-%s-\n", p);*/

	 p = strtok(NULL, "|");
	 if (p)  strcpy(tampon_prenom , p);/*  printf("-%s-\n", p);*/

	 p = strtok(NULL, "|");
	 if (p)  strcpy(tampon_mail , p);/*  printf("-%s-\n", p);*/

	 /*************************************************/
	 /*coder ici ce que l'on veut faire des infos lues*/
	 printf("%s\n", tampon_tel);
	 printf("%s\n", tampon_nom);
	 printf("%s\n", tampon_prenom);
	 printf("%s\n\n", tampon_mail);
	 printf("%s\n\n", "Appuyez sur une touche...");
	 getch();
	 /*************************************************/
	}
	fclose(repertoire);
 return 0;
 }
0