Lecture fichier et test des lignes...

Résolu
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007 - 15 oct. 2006 à 18:42
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 17 oct. 2006 à 00:01
Bonjour,


J'aimerai lire un fichier qui ressemble a ca:

KJ  1 3 5;

I  OPL;

B 12 34 78, 90;

I  PPL;

et ainsi de suite des lignes qui ne sont pas du meme type:


D' habitude je lis des fichiers ou chaque ligne est pareil (genre 4 float séparé par des virgules)

Mais pas la!

Comment je peux faire pour lire ligne par ligne, tester si j'ai KJ ou I ou B ou ... au debut

pour ensuite lire si j'ai KJ les 3 int qui suivent, si I le string et si B les 4 ints ...etc ?


MErci beaucoup pour votre aide!

9 réponses

jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
16 oct. 2006 à 20:18
Ce que tu peux faire c'est lire les 3 premiers caractère pour tester si
le premier caractère "I" ou si les 2 premiers "KJ" ...

   FILE *filein;

    char chaine[255];

    filein = fopen("data/World.txt",
"rt");           
    // File To Load World Data From

    if(filein != NULL)

    {

        while (fgets(chaine, 250, filein)
!= NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)

        {

             if(chaine[0] == 'B')

             {

               
sscanf(chaine, "B %d", &num1);

             }

             if(chaine[0].chaine[1]== ' KJ')

            {

                   // instruction ....

            }

        }

    }

    fclose(filein);
3
rrk275 Messages postés 540 Date d'inscription vendredi 25 juin 2004 Statut Membre Dernière intervention 1 octobre 2007 2
15 oct. 2006 à 21:43
Salut,
en gros:
Pour chaque ligne
    Lire le premier
    Si premier = = I
       lire string
     Si premier = = B
       lire les 4 ints
     Si premier = = KJ
        lire les 3 ints
Fin Pour
.. apres a toi de voir comment stocker ca,
un tableau pour tous les I, un pour les B un pour les KJ ... tout depend de son utilité ..
Louis
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 39
16 oct. 2006 à 00:48
Salut :

Remarque : il vaut mieux ne pas mettre des ";" à la fin de chaque ligne.

// cette fonction découpe une phrase en un tableau
// de chaînes de caractères 
char ** tokenize (char * txt) {
    const int MAX = 10;
    const char * DELM = " ";
    char ** tok = (char **)malloc (MAX*sizeof(char *));
    int I = 0;
    char * sep = strtok (txt, DELM);
    while(sep != NULL) {
       tok [I++] = (char *)strdup (sep);
       sep = strtok (NULL, DELM);
    }
    return tok;
}

FILE * stream;

stream = fopen ("file.dat", "r");
if (!stream)
    return;

char buffer [BUFSIZ];

while (fgets (buffer, BUFSIZ, stream) != NULL)
{
    char ** tokens = tokenize (buffer);
    if (tokens) {
       if (!strcmpi (tokens [0], "I") {
           // traitement
       }
       else if (!strcmpi (tokens [0], "B") {
         
// traitement


       }
       else if (!strcmpi (tokens [0], "KJ") {
         
// traitement


       }
       // libérer la mémoire
       free (tokens);
       tokens = NULL;
    }
}
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
16 oct. 2006 à 01:36
strtok doit etre definitivement abandonné.

Elle se sert d'une variable implicite, la même quel que soit le thread appelant, c'est une pure calamité issue d'un autre age. Les bugs qu'elle peut engendrer seront très difficiles à retrouver.

2 pointeurs suffisent pour le même travail mais avec un résultat assuré.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 39
16 oct. 2006 à 19:11
Salut :

Comment peut on remplacer "strtok" par deux pointeurs?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 39
16 oct. 2006 à 21:53
Salut :

Comment peut on écrire ça :

// ????

if(chaine[0].chaine[1]== ' KJ') {
}

c'est faux.
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
16 oct. 2006 à 22:32
C'est "abgrégé"!

Tu t arrange pour créer une fonction genre

char* Get3PremierChars(char* s)

{

    return s[0].s[1].s[2];

}


que tu utilise par la suite pour tes tests!
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
16 oct. 2006 à 23:59
TXT VERS LISTBOX (WIN32)
http://www.cppfrance.com/code.aspx?id=25258

Ombitious > regarde comment je détaille les lignes pour insertion dans une listbox. Le principe est le même quel que soit les séparateurs recherchés.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 17
17 oct. 2006 à 00:01
OUPS grave faute:
"... quels que soient...."

ciao...
BruNews, MVP VC++
0
Rejoignez-nous