let ecriture_instance ?(action_confirmation = demande_confirmation ) ~i ~file = 
        
        (** On demande de plus l'adresse (relative ou absolue) du fichier où on veut écrire. *)

        
        (** /!\ CONVENTION : on utilise la réprésentation fichier de Unix. Par exemple : "/home/superman/Bureau/puzzle_de_la_mort_qui_tue.instance". *)


        
        (** On ouvre le canal, on vérifie si on peut écrire. *)

        if (Sys.file_exists file) && (file <> "stdout"then (
                
                (** Comme on est poli, on demande confirmation avant d'écraser un fichier déja existant ! *)

                action_confirmation file;
                );

        let canal_sortie  =                                        (* Le canal de sortie 'stdout', celui de l'écran actuel *)
                (match file with                                (* a droit a un traitement spécial, parce qu'on ne peut *)
                | "stdout"         ->         stdout;                (* le fermer par un 'close_out'. *)
                | _                ->         open_out file;)
        in
        let mprint        s =        ecrire_sortie canal_sortie s; in
        let mprint_int        s =        ecrire_sortie canal_sortie ((string_of_int s)^" "); in
                
                (** Macros pour imprimer dans le fichier de sortie, et pour l'actualiser (ecrire_sortie le fait tout seul). *)

                
        
        (** On écrit, *)

        let (c, n, m, p) = (i.ci, i.ni, i.mi, i.pi) in
                
                (** La premiere ligne : m n c, *)

        mprint_int m;
        mprint_int n;
        mprint (string_of_int c); (* pour ne pas mettre d'espace en fin de ligne *)
        mprint "\n";
        
                
                (** Puis une ligne par pièce : couleur de droite, du haut, de gauche, et du bas. *)

        let rec print_liste_piece = function
                | []                        -> ();
                | x :: sslistp        -> 
                        mprint_int x.d;
                        mprint_int x.h;
                        mprint_int x.g;
                        mprint (string_of_int x.b);(* pour ne pas mettre d'espace en fin de ligne *)
                        mprint "\n";
                        print_liste_piece sslistp;
        in
        print_liste_piece p;

        
        (** On conclut. *)

        flush canal_sortie;
        match file with
                | "stdout"         ->         ();
                | _                ->         close_out canal_sortie;
        ()