[JAVA] - Nacitani vstupu pomoci System.in.read()

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Zdářa 27. 12. 2006 18:49

Zdravim, mám takovej menší problém s načítáním. Tak jak je to napsany to funguje, ale je tu menší háček. Když se zadá chybný vstup, tak to správně vyhodí vyjímku a cyklus se opakuje, což je dobře, ale když to podruhé najede na to načítání tak se program nezastaví, ale načte si tam nějaky hodnoty sám, což teda nechápu co je zač. No a tím pádem to jde zase do vyjímky a cyklus se začna zase opakovat ale tentokrát(na 2. pokus) se to už zastaví. Nevíte někdo v čem by mohl být problém?

Jen tak pro info: načítá to 2 čísla tahu na šachovnici ve vymezenym rozsahu 0-8. Zřejmě to načítání bude asi začátečnickým zpusobem napsany, ale berte ohled na to, že já jím jsem :wink:

Kód: Vybrat vše
   //   nacti tah
    public void nactiTah(String text)
   {
      final int length = 2;
      byte pole[] = new byte[length];
      boolean ok = false;
      String strX = "";
      String strY = "";
      int x;
      int y;
      
      while(ok == false)
        {
         System.out.print("Zadej souradnice " + text);
         
           try
           {
               System.in.read(pole);           
              strX += (char)pole[0];
              x = Integer.parseInt(strX);   
              strY += (char)pole[1];
              y = Integer.parseInt(strY); 
           }
           catch(NumberFormatException e)
           {
              System.out.println("Zadavej jenom cisla, vole!");
              strX = "";
              strY = "";
              continue;
           }
           catch(Exception e)
           {
              System.out.println("Chyba na vstupu, vole!");
              strX = "";
              strY = "";
              continue;
           }

           if((x < 0) || (x > 7) || (y < 0) || (y > 7))
           {
              System.out.println("CHYBA: Zadejte 2 cisla v rozsahu 0-7!");
              strX = "";
              strY = "";
              continue;
           }
           else
           {
              mX = x;
              mY = y;
              ok = true;
           }   
        }
   }
Zdářa
Junior

Odeslat příspěvekod Nargon 27. 12. 2006 22:29

Nejsem Javar, ale pravdepodobne mas problem s tim ze si ten vstupni stream pamatuje co jsi tam zadal.
Tedy ty zadavas do 2bajtovyho bufferu. Takze tam nactes 2 znaky.
Problem je, ze kdyz napises: "15"[enter] tak i ten enter se tam vlozi v pripade windows jsou enter 2 znaky s kodem 13,10 v unixu je to myslim jen ta 13ka.
A kdyz tam zadas 99345 tak to napoprvy vezme 99, a oznami chybu, ze je to vetsi nez 7, pak to vezme 34 (a ani se te to nepta na zadani cisel) atd.

Takze by mohlo pomoci, aby jsi po kazdym nacitani ten buffer vyprazdnil.
Takze udelat asi tohle:
Kód: Vybrat vše
System.in.read(pole);   
System.in.read(new byte[System.in.available()]);

to by melo precist a zahodit ten zbytek dat co tam zadas.
Bude to fungovat pokud budes zadavat data z klavesnice. Jakmile jako vstup presmerujes treba soubor, nebo nejakej jinej stream tak je problem. Nacte to prvni dva byty a zbytek to jen zahodi.
Nargon
Moderátor

Odeslat příspěvekod Zdářa 28. 12. 2006 17:35

fakt díky, dělá to přesně to co říkáš - načte si to 13 a 10... Už to funguje jak má s tím vyprázdněním bufferu...
máš pak u mě pivko :)
Zdářa
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků