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;
()