/**
 * @file Adresse.cpp
 * Projet sem05-td-Cpp1
 * @author l'équipe pédagogique 
 * @version 1 18/01/06
 * @brief corrige du TD n°5 - Exercice 1
 * Structures de données et algorithmes - DUT1 Paris 5
 */

#include "Adresse.h"
#include <limits>
using namespace std;

/**
 * @brief vider un flot d'entrée
 * effacer tout caractère dans un flot d'entree jusqu'à la fin de la ligne, 
 * y compris le '\n'
 * @param [in,out] is est le flot d'entrée
 */
void nettoyerLigne (istream& is) {
	is.ignore(numeric_limits<streamsize>::max(),'\n');
}

/**
 * @brief Insertion des données d'adresse dans un flot de sortie
 * les données (encadrées de "|") sont affichées en lignes 
 * @param [in,out] os : le flot de sortie
 * @param [in] a : l'adresse à afficher
 */
void afficher (ostream& os, const Adresse& a) {
	os << "prénom : |" << a.prenom << "| ";
	os << "nom : |" << a.nom << "| ";
	os << "n° : |" << a.numero << "| ";
	os << "rue : |" << a.rue << "| ";
	os << "code postal : |" << a.codePostal << "| ";
	os << "ville : |" << a.ville << "|";
	os << endl;
}

/**
 * @brief Extraction d'une adresse d'un flot d'entrée
 * @param [in,out] is : le flot d'entree
 * @return l'adresse saisie
 */
Adresse saisir (istream& is) {
	Adresse a;
	const char FIN = '\n';
	is.width(Adresse::MAX);  // pour sécuriser l'entrée du prenom et du nom 
    is >> a.prenom >> a.nom; // 1ère ligne (nom et prénom (sans espace))
	is >> a.numero;          // 2ème ligne (n° de la rue) 
	is >> ws;			// Passer '\n' (cohésion avec le get/getline suivant) 
	is.getline(a.rue, Adresse::MAX, '\n'); // 3ème ligne (rue (avec espaces))
										   // ou is.get(...)
	is >> a.codePostal;		 // 4ème ligne (code postal)
	is >> ws; 	// ws : ignore les white spaces
				//  ou : char c; is.get(c); (un espace sépare code et ville)
	is.getline(a.ville, Adresse::MAX, FIN); // 4ème ligne (ville (avec espace)
											// ou is.get(...)
	is >> ws;	// 5ème ligne blanche	
	return a;
	// Remarques liées à la portabilité
	// Remarque 1 : La fin de ligne est codée
	// sous Windows : 0D 0A : 13 10 : \r \n : CR LF
	// sous Linux   : 0A : 10 : \n : LF
	// sous Mac     : 0D : 13 : \r : CR
	// cf. Editeur Hexadécimal (EditHexa)
	// Remarque 2 : changer par FIN='\r'  si le fichier lu
	// est créé sous Windows et qu'il est traité (par ce programme) sous le 
	// standard de fin de ligne Linux (cf. Cygwin IUT). Evite ainsi l'inclusion 
	// du caractère \r aux données relues avec le délimiteur FIN. 
	// Remarque 3 : pour des fichiers constitués manuellement et pouvant ne pas 
	// respecter le format donné, utilisez : nettoyerLigne(is); 
    // permet de vider le flot d'entrée des données inutiles jusqu'à la 
    // fin de ligne comprise
}
