import java.io.Reader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;

class Fichier
{
    public static char[] lire_fichier(String nom_fichier)
    {
        LireFichier f = new LireFichier(nom_fichier);
        int cpt = 0;
        
        while( f.il_reste_des_caracteres_a_lire() )
        {
            f.lire_caractere();
            cpt=cpt+1;
        }
        
        f.revenir_au_debut();
        char[] result = new char[cpt];
        cpt=0;
        
        while( f.il_reste_des_caracteres_a_lire() )
        {
            result[cpt] = f.lire_caractere();
            cpt=cpt+1;
        }
        
        return result;
    }
    
    
    public static void ecrire_fichier(String nom_fichier, char[] tab)
	{
        EcrireFichier g = new EcrireFichier(nom_fichier);
	    for(int i=0; i<tab.length; i++)
	    {
	        g.ecrire_caractere(tab[i]);
	    }
	} 
    

    private static char normaliser_caractere(char c)
    {
        switch(c)
        {
            case(232):
            case(233):
            case(234):
            case(235):
                return 'e';

            case(249):
            case(250):
            case(251):
            case(252):
                return 'u';
        
            case(236):
            case(237):
            case(238):
            case(239):
                return 'i';

            case(224):
            case(225):
            case(226):
            case(227):
            case(228):
            case(229):
                return 'a';
            
            case(242):
            case(243):
            case(244):
            case(245):
            case(246):
                return 'o';

            case(231):
                return 'c';
                
            case(241):
                return 'n';
                
            case(253):
            case(255):
                return 'y';

            default:
                return c;
        }
    }


    /**************************
     Class interne de lecture
     **************************/
    static class LireFichier
    {
        Reader fichier;
        int lastread;
        String nom_fichier;
        
        
        private LireFichier(String nom_fichier_a_lire)
        {
            try
            {
                nom_fichier=nom_fichier_a_lire;
                fichier = new InputStreamReader(new FileInputStream(nom_fichier), "UTF-8");
                lastread=-1;
            }
            catch(FileNotFoundException e)
            {
                System.out.println("Le fichier "+nom_fichier_a_lire+" n'a pas pu etre ouvert.");
                System.out.println("Verifiez que le nom et le chemin d'acces du fichier sont corrects, que ce n'est pas un dossier,");
                System.out.println("et que vous avez les droits de lecture sur le fichier.");
                System.out.println("Le repertoire courant de travail est :");
                System.out.println(System.getProperties().get("user.dir"));
                System.out.println("Le programme se termine a cause de cette erreur.");
                System.exit(0);
            }
            catch(UnsupportedEncodingException e)
            {
                System.out.println("Le fichier "+nom_fichier_a_lire+" n'a pas pu etre ouvert car il n'est pas en format UTF8.");
                System.out.println("Le repertoire courant de travail est :");
                System.out.println(System.getProperties().get("user.dir"));
                System.out.println("Le programme se termine a cause de cette erreur.");
                System.exit(0);
            }
            
        }
        
        private char lire_caractere()
        {
            int letter_read;
            char caractere_lu='\0';
    
            if(lastread != -1)
            {
                caractere_lu = (char)lastread;
                lastread=-1;
            }
            else
            {
                try
                {
                    caractere_lu = (char)fichier.read();    
                }
                catch(Exception e)
                {
                    System.out.println("Erreur pendant la lecture du fichier.");
                    System.out.println("Le programme se termine a cause de cette erreur.");
                    System.exit(0);
                }
            }
    
    
            if(Character.isLetter(caractere_lu))
            {
                caractere_lu = Character.toLowerCase((char)caractere_lu);
                caractere_lu = normaliser_caractere(caractere_lu);
            }   
            return caractere_lu;
        }
    
    
        private boolean il_reste_des_caracteres_a_lire()
        {
            try
            {
                lastread = fichier.read();
            }
            catch(Exception e)
            {
                System.out.println("Erreur pendant la lecture du fichier.");
                System.out.println("Le programme se termine a cause de cette erreur.");
                System.exit(0);
            }
    
            return (lastread != -1);
        }
        
        private void revenir_au_debut()
        {
            try
            {
                fichier.close();
                fichier = new InputStreamReader(new FileInputStream(nom_fichier), "UTF-8");
                lastread=-1;
            }
            catch(Exception e)
            {
                System.out.println("Erreur pour revenir au debut du fichier.");
                System.out.println("Le programme se termine a cause de cette erreur.");
                System.exit(0);
            }
        }
    }
    
    
    /*********************
     Classe interne d'ecriture
     ********************/ 
    static class EcrireFichier
    {
    	Writer fichier;
    		
    	private EcrireFichier(String nom_fichier_a_ecrire)
    	{
    		try
    		{
    			fichier = new OutputStreamWriter(new FileOutputStream(nom_fichier_a_ecrire), "UTF-8");
    		}
    		catch(Exception e)
    		{
    			System.out.println("Le fichier "+nom_fichier_a_ecrire+" n'a pas pu etre ouvert.");
    			System.out.println("Verifiez que le nom et le chemin d'acces du fichier sont corrects, que ce n'est pas un dossier,");
    			System.out.println("et que vous avez les droits d'ecriture sur le fichier.");
    			System.out.println("Le repertoire courant de travail est :");
    			System.out.println(System.getProperties().get("user.dir"));
    			System.out.println("Le programme se termine a cause de cette erreur.");
    			System.exit(0);
    		}
    	}
    
    	private void ecrire_caractere(char c)
    	{
    		try
    		{
    			fichier.write((int)c);	
    			fichier.flush();
    		}
    		catch(Exception e)
    		{
    			System.out.println("Erreur pendant la lecture du fichier.");
    			System.out.println("Le programme se termine a cause de cette erreur.");
    			System.exit(0);
    		}
    	}      
    }
    
    
}