Utilisation du StreamTokenizer

Hagakure13 Messages postés 5 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 19 avril 2007 - 15 avril 2007 à 23:33
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 19 avril 2007 à 20:24
Bonjour à tous

Voilà, j'ai un problème avec le StreamTokenizer ...
En fait, j'ai un bout de données (que je lis dans un fichier mais ca j'y arrive encore) :

 1 3 45 25 4  2 3 53 20 4  3 3 98 17 4  4 4 11 15 4
 5 5 8 42 5  6 6 94 20 4  7 6 96 60 3  8 7 8 12 4
 9 7 17 85 4  10 8 5 42 5  11 8 7 12 4  12 8 9 8 4

En fait plus specifiquement, on a 5 nombres separer par un espace puis un double espace.
Ce que je voudrais faire c'est entré les 5 nombres dans des variables (ca c'est facile...) mais je voudrais recommencer la mm operation des qu'on a un double espace....
Je m'explique!

FileReader rd = new FileReader( "filename.java");
StreamTokenizer st=new StreamTokenizer(rd);
while (token != StreamTokenizer.TT_EOF) {
    while (// pas de double espace) {
    if (StreamTokenizer.TT_NUMBER){
    bidon=st.nextToken();               //premier nombre
    c[st.nextToken()][st.nextToken()]=st.nextToken();          // deuxieme, troisieme et quatrieme nombre
    vitesse=st.nextToken();            // cinquieme nombre
   
    // est-ce que si token n'est pas un nombre il passe au suivant ?
    }
}

Si deja vous arrivez jusqu'ici je vous en remercie beaucoup
En fait le debut du fichier est un peu plus compliqué^^...

 102  320  110  65  50  40  25
 1 3 45 25 4  2 3 53 20 4  3 3 98 17 4  4 4 11 15 4

A la premiere ligne, on a des doubles espaces... autrement dit, ce que j'ai marqué au dessus ne compte pas pour la premiere ligne :/
Donc comment faire J'avais pensé a definir un nombre de Token mais j'ai vu que la fonction n'existe pas en StreamTokenizer :/

Je pensais aussi utiliser un StringTokenizer :/ Autrement dit, on coupe le fichier en ligne grave au StreamTokenizer et ensuite on l'analyse avec un StringTokenizer... bon d'accord c'est du rafistolage mais bon^^ (je prefererais quand mm avoir une solution pour la premiere proposition).

Voila, d'avance merci beaucoup pour votre aide :)

ps : j'ai bien vu pleins de codes et algo mais je ne comprend vraiment pas ce qu'il faut utiliser pour définir un "bloc" dans une ligne

Merci de votre aide

4 réponses

Hagakure13 Messages postés 5 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 19 avril 2007
17 avril 2007 à 12:52
Bon comme personne ne poste, je vais le faire moi-meme ... Apres deux dur journées de labeur, j'ai pu pondre ça, qui m'avait l'air  assez correct... Seul probleme, je tombe sur un "number not found" :/ Donc si quelqu'un aurait une explication (parce que dans le fichier lu, il y a des nombres ca c'est sur )... Voici le code :

public static void LectureNet(String file_name, int max_number_nodes, int max_number_arcs, int[][] matrix, int[] vitesse) throws IOException {
         File data=new File(""+file_name+"");
         FileReader rd = new FileReader(data);
         StreamTokenizer st = new StreamTokenizer(rd);
         int number_arc=0;
         boolean fin=false;
        
         // First Line
         int[] average_speed=new int[4];
         if (st.ttype==StreamTokenizer.TT_NUMBER) {
         max_number_nodes=(int) st.nval;
         max_number_arcs=(int) st.nval;
             for (int i=0; i<5; i++)
                 average_speed[i]=(int) st.nval;
         }
        
         while (number_arc<=max_number_arcs){
             while (!fin){
                switch (st.ttype) {
                 case StreamTokenizer.TT_NUMBER :
                     number_arc=(int) st.nval;
                     matrix[(int) st.nval][(int) st.nval]=(int) st.nval;
                     vitesse[number_arc]=(int) st.nval;
                     fin=true;
                     break;                    
                 default :
                     System.out.println("Error : no number found! ");
                 }
             }
         }
        
    }

Merci d'avance pour votre aide^^ (qui serat peut etre nombreuse et mouvementée, s'est-on jamais!
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
17 avril 2007 à 21:22
Salut:

J'ai jetté un coup d'oeil sur ton code, mais je n'ai pas vu la méthode nextToken ().

La forme de la boucle:

while (true) {
    int ttype = st.nextToken ();

    if (ttype == StreamTokenizer.TT_NUMBER) {
       // CECI EST UN NOMBRE
       // TRAITEMENTS A FAIRE
    }
    else if (ttype == StreamTokenizer.TT_EOF) {
       break;
    }
}


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts
0
Hagakure13 Messages postés 5 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 19 avril 2007
19 avril 2007 à 19:52
Merci, je vais voir si ca fonctionne et j'editerais mon post!
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
19 avril 2007 à 20:24
Salut:

Autre chose à faire avant d'utiliser StreamTokenizer et d'initialiser ce qu'on appelle "la table syntaxique".

Exemple:

FileReader fileReader = new FileReader ("data.txt");
StreamTokenizer st = new StreamTokenizer (fileReader);

// Initialiser table syntaxique

st.commentChar ('#'); // Tout ce qui vient après un # est un commentaire
st.parseNumbers (); // Pour parser les nombres

// VOIR DOCUMENTATION POUR PLUS D'INFORMATIONS
// ...


________________________________________________________________________________
A.B. : 
"Dieu nous donne des mains, mais il ne bâtit pas les ponts"
0
Rejoignez-nous