/**
 * Fonctions de gestion de fichier.
 *
 */

import java.io.*;
import java.util.Scanner;
import java.util.Locale;

public class Fichier {

  private
    String filename;
    Scanner in = null;
    PrintWriter out = null;

  /**
    * Ouverture d'un fichier.
    *
    * @param f Le Fichier à ouvrir.
    * @param filename Le nom du Fichier à ouvrir.
    * @param mode Le mode d'ouverture du fichier ("r" pour lecture, "c" pour création puis écriture, "w" pour écriture en queue).
    * @return Le booleen indiquant si l'ouverture a abouti.
    */
  public static boolean ouvrir(Fichier f,String filename,String mode) {
    f.filename = new String(filename);
    if ( mode == "r" ) {
      try {
        f.in = new Scanner(new FileInputStream(filename));
        f.in.useLocale(Locale.US); }
      catch (Exception e) {
        System.out.println("Erreur");
        return(false); }
      return(f.in != null); }
    if ( mode == "w" ) {
      try {
        f.out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(filename),true))); }
      catch (Exception e) {
        System.out.println("Erreur");
        return(false); }
      return(f.out != null); }
    if ( mode == "c" ) {
      try {
        { File file = new File(filename);
          file.delete(); }
        f.out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(filename),true))); }
      catch (Exception e) {
        System.out.println("Erreur");
        return(false); }
      return(f.out != null); }
    return(false);
  }

  /**
    * Fermeture d'un fichier.
    *
    * @param f Le Fichier à fermer.
    */
  public static void fermer(Fichier f) {
    try {
      if ( f.in != null )
        f.in.close(); }
    catch (Exception e) { }
    try {
      if ( f.out != null )
        f.out.close(); }
    catch (Exception e) { }
  }

  /**
    * Test de l'existence d'une valeur encore à lire dans un fichier.
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le booleen indiquant si une valeur reste à lire (true si oui, false si non).
    */
  public static boolean estFini(Fichier f) {
    try {
      if ( f.in != null )
        return(!f.in.hasNext()); }
    catch (Exception e) { }
    return(true);
  }
  
  /**
    * Ecriture dans un fichier.<br />
    * Indication entre parenthèses de la liste des 0, 1 ou plusieurs parametres à écrire:<br />
    * - variables,<br />
    * - constantes,<br />
    * - expressions,<br />
    * - ...
    *
    * @param f Le Fichier dans lequel réaliser l'écriture.
    */
	public static void afficher(Fichier f,Object... s) {
		for (Object o : s) {
			f.out.print(o.toString()); }
	}

  /**
    * Ecriture dans un fichier suivie d'un saut de ligne.<br />
    * Indication entre parenthèses de la liste des 0, 1 ou plusieurs parametres à écrire:<br />
    * - variables,<br />
    * - constantes,<br />
    * - expressions,<br />
    * - ...
    *
    * @param f Le Fichier dans lequel réaliser l'écriture.
    */
	public static void afficherln(Fichier f,Object... s) {
		for (Object o : s) {
			f.out.print(o.toString()); }
		f.out.println();
	}

  /**
    * Saut de ligne dans un fichier.
    *
    * @param f Le Fichier dans lequel réaliser l'écriture.
    */
	public static void sautDeLigne(Fichier f) {
		f.out.println();
	}

  /**
    * Lecture dans un fichier d'une valeur de type byte (octet).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le byte lu dans le fichier.
    */
	public static byte lireByte(Fichier f){
		byte b = 0x00;
    if ( f.in != null ) {
      try {
        b = f.in.nextByte(); }
      catch(Exception e) { } }
		return b;
	}

  /**
    * Lecture dans un fichier d'une valeur de type short (entier sur 2 octets).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le short lu dans le fichier.
    */
	public static short lireShort(Fichier f){
		short s = 0;
    if ( f.in != null ) {
      try {
        s = f.in.nextShort(); }
      catch(Exception e) { } }
		return s;
	}

  /**
    * Lecture dans un fichier d'une valeur de type int (entier sur 4 octets).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le int lu dans le fichier.
    */
	public static int lireInt(Fichier f){
		int i = 0;
    if ( f.in != null ) {
      try {
        i = f.in.nextInt(); }
      catch(Exception e) { } }
		return i;
	}

  /**
    * Lecture dans un fichier d'une valeur de type long (entier sur 8 octets).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le long lu dans le fichier.
    */
	public static long lireLong(Fichier f){
		long l = 0L;
    if ( f.in != null ) {
      try {
        l = f.in.nextLong(); }
      catch(Exception e) { } }
		return l;
	}

  /**
    * Lecture dans un fichier d'une valeur de type double (réel double précision (sur 8 octets)).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le double lu dans le fichier.
    */
	public static double lireDouble(Fichier f){
		double d = 0.0;
    if ( f.in != null ) {
      try {
        d = f.in.nextDouble(); }
      catch(Exception e) { } }
		return d;
	}

  /**
    * Lecture dans un fichier d'une valeur de type float (réel simple précision (sur 4 octets)).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le float lu dans le fichier.
    */
	public static float lireFloat(Fichier f){
		float fv = 0.0F;
    if ( f.in != null ) {
      try {
        fv = f.in.nextFloat(); }
      catch(Exception e) { } }
		return fv;
	}

  /**
    * Lecture dans un fichier d'une valeur de type booleen.
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le booleen lu dans le fichier.
    */
	public static boolean lireBoolean(Fichier f){
		boolean b = true;
    if ( f.in != null ) {
      try {
        b = f.in.nextBoolean(); }
      catch(Exception e) { } }
		return b;
	}

  /**
    * Lecture dans un fichier d'une valeur de type chaine de caractères (jusqu'au bout de la ligne en cours).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return La String lue dans le fichier.
    */
	public static String lireString(Fichier f){
		String s = "";
    if ( f.in != null ) {
      boolean lu;
      do {
        try {
          s = f.in.nextLine();
          lu = true; }
        catch(Exception e) {
          lu = false; } }
      while ( !lu || ( s.equals("") ) ); }
		return s;
	}

  /**
    * Lecture dans un fichier d'une valeur de type chaine de caractères (un mot).
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return La String lue dans le fichier.
    */
	public static String lireMot(Fichier f){
		String s = "";
    if ( f.in != null ) {
      try {
        s = f.in.next(); }
      catch(Exception e) { } }
		return s;
	}  

  /**
    * Lecture dans un fichier d'une valeur de type caractère.
    *
    * @param f Le Fichier dans lequel réaliser la lecture.
    * @return Le caractere lu dans le fichier.
    */
	public static char lireChar(Fichier f){
		String s = "";
    if ( f.in != null ) {
      try {
        s = f.in.next(); }
      catch(Exception e) { } }
		return s.toCharArray()[0];
	}  
}