All pastes #793271 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-11-22 02:49 UTC
rendered paste body
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

/**
 * Ensemble de fonctions pour faciliter la lecture de nombres et de caracteres
 * au clavier. Pour faire usage de cette classe, vous devez soit:
 * <ul>
 * <li>ajoutez le repertoire <tt>/u/dift1015/RessourcesJava</tt> dans votre
 * <tt>CLASSPATH</tt>;</li>
 * <li>ou copiez le fichier <tt>Keyboard.java</tt>
 * dans votre repertoire de travail.</li>
 * </ul>
 *
 * <p>Chaque fonction definie dans cette classe lit une entree par ligne,
 * <i>i.e.</i> si la fonction {@link #readInt() Keyboard.readInt()} est appelee,
 * un entier va etre lu dans la derniere ligne tapee au clavier, et seulement
 * cet entier doit se trouver sur cette ligne ou il y aura une erreur. Il en va
 * default meme pour la lecture d'un nombre reel et d'un caractere. Seul la
 * lecture d'une chaine de caracteres ({@link #readString()
 * Keyboard.readString()}) permet la lecture d'une ligne quelconque. Vous devrez
 * traiter cette ligne manuellement pour gerer des entrees plus
 * sophistiquees.</p>
 *
 * <p><b>Note:</b> Ceci n'est pas un programme. Vous ne pourrez pas l'executer
 * apres l'avoir compile.</p>
 *
 * @author felipe IFT1010, modifie par duranlef IFT1010
 */
public final class Keyboard
{
  /** Derniere ligne lue. */
  private static String derniereEntree;

  /** Le lecteur de System.in... */
  private static BufferedReader keyboard =
    new BufferedReader( new InputStreamReader( System.in ) );

  /** Indique s'il y a eu erreur de la derniere operation. */
  private static boolean erreur = false;

  /** Indique la fin de l'entree (plus rien a lire). */
  private static boolean finEntree = false;

  /** Constructeur "camoufle". */
  Keyboard() {}

  /**
   * Lit la prochaine ligne.
   * @return true si la lecture s'est bien deroulee.
   */
  private static boolean readLine()
  {
    try
    {
      erreur = false; // jusqu'ici tout est beau
      derniereEntree = keyboard.readLine();

      if( derniereEntree == null ) // fin de la lecture?
      {
        finEntree = true;
        derniereEntree = "";
      }
      return true;
    }
    catch( IOException e )
    {
      System.err.println( "Erreur de lecture clavier" );
      erreur = true; // il y a eu un probleme
    }
    return false;
  }

  // ----------------------------------------------------------
  // interface de la classe Keyboard
  // ----------------------------------------------------------

  /**
   * Retourne vrai s'il y a eu une erreur de lecture lors de la derniere
   * operation.
   */
  public static boolean error()
  {
    return erreur;
  }

  /**
   * Retourne vrai s'il n'y a plus rien a lire.
   */
  public static boolean isEof()
  {
    return finEntree;
  }

  /**
   * Lecture d'un entier.
   * @return L'entier lu s'il y a bel et bien un entier a lire. Sinon, un zero
   * est retourne et le prochain appel a {@link #error() error()} retournera
   * <tt>false</tt>.
   */
  public static int readInt()
  {
    if( readLine() ) // lecture de la prochaine ligne
    {
      try
      {
        return Integer.parseInt( derniereEntree );
      }
      catch( NumberFormatException e )
      {
        // Affiche un message d'erreur pour avertir de l'erreur
        //System.err.print( "La chaine saisie n'est pas un entier. " );
        //System.err.println( "Je retourne 0 a la place." );
        erreur = true; // mauvais format
      }
    }
    return 0;
  }

  /**
   * Lecture d'un nombre reel.
   * @return Le nombre lu s'il y a bel et bien un nombre a lire. Sinon, un zero
   * est retourne et le prochain appel a {@link #error() error()} retournera
   * <tt>false</tt>.
   */
  public static double readDouble()
  {
    if( readLine() ) // lecture de la prochaine ligne
    {
      try
      {
        return Double.parseDouble( derniereEntree );
      }
      catch( NumberFormatException e )
      {
        // Affiche un message d'erreur pour avertir de l'erreur
        //System.err.println( "La chaine saisie n'est pas un nombre decimal" );
        //System.err.println( "Je retourne 0. a la place" );
        erreur = true; // mauvais format
      }
    }
    return 0.0;
  }

  /**
   * Lit un caractere.
   * @return Le caractere lu s'il y a bel et bien un caractere a lire et s'il
   * est seul. Sinon, le caractere zero est retourne et le prochain appel a
   * {@link #error() error()} retournera <tt>false</tt>.
   */
  public static char readChar()
  {
    if( readLine() ) // lecture de la prochaine ligne
    {
      if( derniereEntree.length() == 1 )
      {
        // retourne l'unique caractere de la chaine
        return derniereEntree.charAt( 0 );
      }
      else
      {


        erreur = true; // mauvais format
      }
    }
    return (char)0;
  }

  /**
   * Lecture d'une chaine de caracteres.
   * @return La chaine lu s'il n'y a pas eu d'erreur de lecture. Sinon, la
   * chaine vide est retournee et le prochain appel a {@link #error() error()}
   * retournera <tt>false</tt>.
   */
  public static String readString()
  {
    if( readLine() ) // lecture de la prochaine ligne
      return derniereEntree;
    return "";
  }

}