PB Scanf()

Résolu
mleclaire
Messages postés
15
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
18 mars 2007
- 8 mars 2006 à 09:01
Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
- 10 mars 2006 à 01:46
Bonjour je suis débutant en programmation,je suis en train de programmer en c++ builder,est ce que c'est possible d'utiliser scanf()?
si oui,je voudrait récuperer un mot dans une ligne.

ex de ligne:

aaaa;bbbb;cccc;dddd;eeee
ffff;gggg;hhhh;iiii;jjjj

comment je doit faire si je veut avoir le deuxième mot ds chaque ligne de mon fichier texte?
meme question pour le premier et le troisième mot de chaque ligne?
et meme question pour une ligne?

merci d'avance pour vos réponse clair vu ke je suis un débutant!!

27 réponses

julienbj
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
15
8 mars 2006 à 23:35
Non, ce que je t'ai donné est pour utiliser les fonctions de la famille de scanf (fscanf, sscanf...)
Pour lire le fichier en entier, faire comme la marque Guillemouze.

char nb; //Numero du mot a lire

file = fopen(...)
while (!feof(file))
{
fscanf(file, "%*[^;\n\0];%[^;\n\0];%*[^\n\0]", buffer); //Second mot de chaque ligne
//On a lu toute la ligne, donc on passe de ligne en ligne dans le fichier.
//le dernier %*[^\n\0] permet de s'assurer de la lecture de tout le reste de la ligne.
... //Ici tu traites ton mot.
}

Si tu veux lire tous les mots de ta ligne en une seule passe:
Il faut que tu charges toute ta ligne dans un buffer avec %[^\n\0].
Ensuite tu parcours ta chaine pour compter le nombre de ; (on le notera nb) ca veut dire qu'il y a nb+1 mot.
Tu fais une boucle qui te lis ensuite les mots.

nbcar=0;
for (i = 0; i < nb + 1; i++)
{
sscanf(ligne+nbcar, "%[^;\n\0];", buffer);
nbcar += strlen(buffer) + 1; //+1 pour le ; non pris dans buffer mais lu dans sscanf.
//Tu peux aussi utiliser un tableau de chaines de carcatères pour lire tes mots.
//Enfin, ca c'est toi qui voit en fonction de ce que tu veux faire avec tes mots, et de combien de temps ils te servent.
}

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
15
8 mars 2006 à 23:38
Ah si, pour Guillemouze.
Quand tu utilises %s dans les fonctions de la famille scanf, tu lis jusqu'a renconter un caractère blanc (espace, tabulation, fin de ligne...) C'est pour ca que ca ne fonctionnait pas avec ta solution.
D'autre part, la grande utilité de %[] est de pouvoir lire des lignes entieres, sans se soucier de ces dits caracteres blancs.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
julienbj
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
15
8 mars 2006 à 23:49
mleclaire, si tu veux lire un mot de ta ligne en particulier, je te conseilles de faire une fonction de ce style:

//renvoie 0 en cas de réussite, un code d'erreur non nul autrement
unsigned char readWord(FILE *ptr_file, char *word, unsigned char nb)
{
if (word) //Il faut que word soit alloué
{
unsigned char nb = 0, len;
char ligne[255];
fscanf(ptr_file, "%[^\n\0]", ligne); //Lecture de tte la ligne
len = strlen(ligne);
for (i = 0; i < nb, nbcar <= len ; i++) //Je suis pas certain du <=, a tester
{
sscanf(ligne+nbcar, "%[^;\n\0];", word);
nbcar += strlen(word) + 1; //+1 pour le ; non pris dans buffer mais lu dans sscanf.
}
if (nbcar > len)
{
*word='\0';
return 2;
}
return 0;
}
return 1;
}

En lisant toute ta ligne, au moins tu pourras lire le mot que tu veux.
Le mieux serait de lire ta ligne dans une fonction, puis les mots dans une autre.
Comme ca tu ne lis ta ligne qu'une seule fois.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
mleclaire
Messages postés
15
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
18 mars 2007

9 mars 2006 à 08:31
voila mon code

ListBox3->Visible=true;
FILE *lecture; //declaration d'un fichier
lecture=fopen("Messier.txt","rt"); //ouverture du ficher
char buffer[7][MAX_LENGHT]; //declaration des buffer
fscanf(lecture,"%*[^;\n\0];%[^;\n\0];%*[^\n\0]",buffer[0]); //scann du fichier texte sauvegarder ds le buffer 0
ListBox3->Items->Add((AnsiString)buffer[0]); //affichage


cela m'affiche rien du tout!!!
je ne comprend pas je suis a bout
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mleclaire
Messages postés
15
Date d'inscription
vendredi 4 mars 2005
Statut
Membre
Dernière intervention
18 mars 2007

9 mars 2006 à 08:31
voila mon code

ListBox3->Visible=true;
FILE *lecture; //declaration d'un fichier
lecture=fopen("Messier.txt","rt"); //ouverture du ficher
char buffer[7][MAX_LENGHT]; //declaration des buffer
fscanf(lecture,"%*[^;\n\0];%[^;\n\0];%*[^\n\0]",buffer[0]); //scann du fichier texte sauvegarder ds le buffer 0
ListBox3->Items->Add((AnsiString)buffer[0]); //affichage


cela m'affiche rien du tout!!!
je ne comprend pas je suis a bout
0
julienbj
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
15
9 mars 2006 à 22:19
Vérifie que lecture est valide. (!= -1).
Sinon, envoie moi ton con code (et le fichier texte), je regarderais pourquoi ça marche pas.
Tu peux aussi essayer de retirer le t du fopen, je ne l'ai jamais utilisé, peut etre que... mais j'en doute.
Affiche aussi dans la console le contenu de buffer[0] par un printf. Tu t'assureras ainsi qu'il n'a pas lu et que ce n'est pas ta fonction d'affichage dans la listbox qui marche pas.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
Guillemouze
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
7
10 mars 2006 à 01:46
ok
merci pour l'info julienbj :)
0