Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de Scanner

Scan automatique (comme si le scanner n'était pas vidé..)

Sujet résolu
    23 février 2009 à 18:39:27

    Bonjour,

    Je dois faire une application pour ordonnancer des processus en Java.

    Un processus est défini par:

    son nom (String)
    sa durée (int)
    sa priorité (int)

    Donc on peut considérer un processus comme un objet.
    J'ai donc fait une classe "Processus".
    Je l'affiche à titre indicatif !! Le problème ne vient pas de là.. Donc vous pouvez zapper, le code ci dessous..

    CLASSE PROCESSUS

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    
    package ordonnancement;
    
    import java.io.*;
    
    
    /**
     *
     * @author Johann
     */
    public class Processus implements Serializable{
        
        private String nomProcessus;
        private int dureeProcessus;
        private int prioriteProcessus;
        
        
        public Processus(){ /* Constructeur par défaut */
            
            this.nomProcessus = null;
            this.dureeProcessus = 1;
            this.prioriteProcessus = 0;
            
        }
        
        
        
        public Processus(String nom, int duree, int priorite){ /* Constructeur par initialisation */
            
            this.nomProcessus = nom;
            this.dureeProcessus = duree;
            this.prioriteProcessus = priorite;
                
        }
        
        public String getNom(){
            
            return this.nomProcessus;
            
        }
        
        
        public int getDuree(){
            
            return this.dureeProcessus;
            
        }
        
        public int getPriorite(){
            
            return this.prioriteProcessus;
            
        }
    
        
    
    }
    


    Voilà...
    Donc en fait je veux enregistrer plusieurs objets Processus dans un fichier "Ordonnancement1.txt".
    Je ferais l'ordonnancement sur les processus enregistrés dans le fichiers.

    Pour enregistrer mes processus, j'ai fait une classe d'exécution:
    Voici le code:

    package ordonnancement;
    
    import java.util.Scanner;
    import java.io.*;
    
    
    public class ExecutionProcessus {
        
        public static void main(String[] args){
            
            
            Scanner scan1 = new Scanner (System.in);
            String nomProcessus;
            int dureeProcessus;
            int prioriteProcessus;
        
            boolean SaveProDone = false;
            int reponseSaveProDone;
            
            
            
            
           /* SAUVEGARDE DU PROCESSUS DANS UN FICHIER */ 
            try {
                
                
                
                    FileOutputStream ostream = new FileOutputStream("C:/Users/johann/Desktop/Ordonnancement1.txt");
                    ObjectOutputStream out = new ObjectOutputStream(ostream);
                
                    while(SaveProDone == false){
                    
                        /* DEFINITION D'UN PROCESSUS */
                       
                        System.out.println("Entrez un nouveau processus");
                        System.out.println("nom processus ?");
                        nomProcessus = scan1.nextLine();
                        System.out.println("Le nom du processus est: " + nomProcessus);
                    
                        System.out.println("duree processus ?");
                        dureeProcessus = scan1.nextInt();
                        System.out.println("La duree du processus est: " + dureeProcessus);
                    
                        System.out.println("priorite processus ?");
                        prioriteProcessus = scan1.nextInt();
                        
                        System.out.println("La priorite du processus est: " + prioriteProcessus);
            
                        Processus p1 = new Processus (nomProcessus, dureeProcessus, prioriteProcessus);
              
                        out.reset();
                        out.writeObject(p1);
                        out.flush();
           
                        System.out.println ("L'objet a été écrit dans le fichier");
                        System.out.println ("Voulez vous enregistrer un autre processus ?\n1. OUI\n2. NON");
                        reponseSaveProDone = scan1.nextInt();
                        if (reponseSaveProDone == 2){
                        
                            SaveProDone = true;  
                        
                        }
                    
                    } /* FIN WHILE (ENREGISTREMENT PLUSIEURS PROCESSUS */
              
                } /* FIN TRY */
                
            
            
            catch (Exception e1){
                
                e1.printStackTrace();
                
            }
            
         
        } /* FIN MAIN */
        
        
    
    } /* FIN CLASSE */
    


    Voici ce que me donne l'exécution:

    init:
    deps-jar:
    compile-single:
    run-single:
    Entrez un nouveau processus
    nom processus ? 
    PROCESSUS1
    Le nom du processus est: PROCESSUS1
    duree processus ? 
    20
    La duree du processus est: 20
    priorite processus ? 
    5
    La priorite du processus est: 5
    L'objet a été écrit dans le fichier
    Voulez vous enregistrer un autre processus ?
    1. OUI
    2. NON
    
    1
    Entrez un nouveau processus
    nom processus ? 
    Le nom du processus est: 
    duree processus ?


    Lors du 2ème passage dans la boucle d'enregistrement d'un processus, en fait, ça me zappe l'étape (Donner le nom du processus), je ne peux pas donner le nom du 2ème processus ca me le remplit directement avec du vide on dirait...
    Et donc je passe directement à l'étape 2 (Donner la durée du processus)...

    Pourquoi ?


    A mon avis c'est un problème avec le Scanner...

    • Partager sur Facebook
    • Partager sur Twitter
      23 février 2009 à 18:49:38

      On a déjà vu ce genre de problèmes sur le forum, en fait il suffit de réinstancier un Scanner dans la boucle, normalement ça marche.

      Et autant avant je pensais savoir pourquoi, maintenant je ne sais pas du tout.
      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2009 à 19:03:39

        En fait le problème c'est que nextInt ne lis pas le retour à la ligne et c'est normal car cette méthode doit renvoyer un entier.

        Donc, si tu utilise un nextLine après un nextInt, le nextLine va lire le retour à la ligne et zapper.

        Donc en fait comme nom de processus tu as un retour à la ligne.
        A la fin de ta boucle, tu dois donc faire :
        monScanner.nextLine ();
        Ainsi tu lis le retour à la ligne qui ne sert à rien.

        Et on reviens au début de la boucle.^^
        Tu captes ce que je veux dire ?
        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2009 à 19:15:33

          On ne peux pas "purger" directement tous ce qui est écris dedans ?
          une espèce de flush ou qqch du genre .?
          je n'ai pas été voir mais je ne vois pas l'utilité de lire qqch d'inutile :p^^
          donc je me dis un Scanner.flush() ; ou autre truc se rapprochant


          edit: j'ai pas trouvé dans la docs en tout cas :p
          donc je suppose qu'il y'a pas :(
          mais je me demande si le type copie colle un text de plusieurs ligne (avec plusieurs retour à la ligne dedans)
          comment vider le scanner sans boucle while =/ ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2009 à 19:25:00

            Ha ça je me le demande, pour l'instant je me contente de lire qlch d'inutile, mais je ne comprends pas ce que tu veux dire snoop,...

            Mais bon le problème est que on ne peux pas le vider vu que ça lis des données entrée dans la console et les renvoient par une méthode et non dans un flux, si tu vois ce que je veux dire.

            Une autre solution serait de remplacer les nextInt par des nextLine, stocker dans une variable temporaire de type String et essayer la méthode parseInt, ça je n'ai pas encore essayer tiens.



            • Partager sur Facebook
            • Partager sur Twitter
              23 février 2009 à 19:28:29

              Merci beaucoup.
              Effectivement ça fonctionne.

              En fait c'est un peu le même problème qu'on a en langage C avec le scanf il me semble..

              Sinon j'avais pensé aussi à une méthode flush()pour le scanner mais ça n'existe pas..
              • Partager sur Facebook
              • Partager sur Twitter
                23 février 2009 à 19:36:00

                Wai je sais, je fais aussi du C à l'école et je fais beaucoup de lecture de fichiers.

                J'ai aussi pas mal de problème de ce genre, notamment quand il faut lire à la fin le \0 et le \n lorsque j'utilise la fonction fgets.

                Avec scanf j'ai déjà eu pas mal de problèmes aussi, et ça m'a bien énervé.

                De plus ça change selon les systèmes d'exploitation, des fois t'a le retour chariot avec qui est bien embêtant aussi lui.
                J'ai eu ce problème il y a pas longtemps en lisant un fichier texte du bloc note, car il y avait le retour chariot.

                Comme quoi ... Faut faire gaffe.
                • Partager sur Facebook
                • Partager sur Twitter
                  24 février 2009 à 8:56:29

                  Citation : Snooooopy

                  On ne peux pas "purger" directement tous ce qui est écris dedans ?
                  une espèce de flush ou qqch du genre .?
                  je n'ai pas été voir mais je ne vois pas l'utilité de lire qqch d'inutile :p^^
                  donc je me dis un Scanner.flush() ; ou autre truc se rapprochant


                  edit: j'ai pas trouvé dans la docs en tout cas :p
                  donc je suppose qu'il y'a pas :(
                  mais je me demande si le type copie colle un text de plusieurs ligne (avec plusieurs retour à la ligne dedans)
                  comment vider le scanner sans boucle while =/ ?


                  Je n'ai jamais trouvé non plus, mais il y a des moyens pour choisir le caractère de fin(créer son propre pattern), ou alors faire un nextLine et reconvertir après, ca permet de ne pas avoir ce caractère de retour.
                  Pour rester dans une solution simple ... il n'y a que ce rafistolage :p
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Probleme de Scanner

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown