Lecture fichier et test des lignes...

[Résolu]
Signaler
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
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

Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

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);
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
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
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
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;
    }
}
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut :

Comment peut on remplacer "strtok" par deux pointeurs?
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut :

Comment peut on écrire ça :

// ????

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

c'est faux.
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

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!
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
OUPS grave faute:
"... quels que soient...."

ciao...
BruNews, MVP VC++