1 Programmation en C++ IO en C++/SL ● Standard Library ● Types, objets pour IO ● L'entrée de clavier ● Sortie à l'écran ● Fichiers
2 Librairie Standard (SL) ● Les opérations d'entrée/sortie sont définies dans la bibliothèque standard du C++ (SL) ● La bibliothèque standard – Fait partie du langage – Tout le code est contenu dans les fichiers ‘header’, pas de librairies à linker – Il faut inclure les 'headers' qu'on veut utiliser – Tous les types/objets se trouvent dans le namespace std #include int main() { // on peut se servir des // objets/fonctions définis dans // return 0; } définition des objets/fonctions pour IO
3 Les Types, Objets pour IO (Flots) ● La bibliothèque standard définit des types et des objets spécialement destinés pour IO ● Le types de base : std::istream, std::ostream – std::istream : définit des objets qu'on peut utiliser pour l'entrée (input) – std::ostream : définit des objets qu'on peut utiliser pour la sortie (output) ● Objets global de flots (stream) : std::cin, std::cout, std::cerr – Ils sont déjà déclarés, et alors disponibles pour leur utilisation, on n'a pas besoin de créer leur instance nous-même – std::cin : le flot standard pour l'entrée; de type std::istream – std::cout : le flot standard pour sortie a l'écran; de type std::ostream – std::cerr : le flot standard pour la sortie des erreurs à l'écran; de type std::ostream
4 Les Opérateurs > ● Opérateurs de flots : > – Effectuent l'opération d'entrée/sortie – Il signifie « envoie vers » ● L'exemple de sortie à l'écran : ● On peut enchaîner des opérations: est équivalent à std::cout << "Bonjour"; L’objet de flot L'opérateur L'objet chaîne (string) envoyé vers l'écran std::cout << "Bonjour"; std::cout << std::endl; std::cout << "Bonjour" << std::endl;
5 Sortie à l'écran #include int main () { int i = 1; float f = 2.3; std::string s = "abcd"; std::cout << " i=" << i << " f=" << f << " s=" << s << std::endl; return 0; } 'Header' de SL pour I/O L'opérateur << est intelligent : il s’adapte au type de l’objet placé à sa droite ● On utilise le flot std::cout et l’opérateur << > exo.exe i=1 f=2.3 s=abcd
6 Entrée du clavier #include int main () { int i; float f; std::string s; std::cin >> i >> f >> s; std::cout << " i=" << i << " f=" << f << " s=" << s << std::endl; return 0; } 'Header' de SL pour I/O Les entrées en cascade sont séparées par tous les caractères de séparation : espace, tabulation, CR ● On utilise le flot std::cin et l’opérateur >> > exo.exe 1 2 Blabla i=1 f=2 s=Blabla
7... Entrée du clavier #include int main () { std::string s; std::getline(std::cin, s); std::cout << “Lit: “ << s << std::endl; std::getline(std::cin, s); std::cout << “Lit: “ << s << std::endl; std::getline(std::cin, s); std::cout << “Lit: “ << s << std::endl; //... return 0; } 'Header' de SL pour I/O On lit la ligne entière, même si elle contient des séparateurs (espace, tab), jusqu'au caractère CR ; Il faut analyser soi-même les lignes ● On utilise le flot std::cin et la fonction std::getline > exo.exe 1 Lit: 1 Un texte Lit: Un texte Un autre texte Lit: Un autre texte
8 Les fichiers ● Les types : std::ifstream, std::ofstream – définissent des objets qu'on peut utiliser pour l'entrée d'un fichier (ifstream) et la la sortie vers un fichier (ofstream) – Ils sont de la même famille que std::istream, std::ostream, et donc les objets de ce type peuvent être manipulés de même façon ● par des opérateurs: > ● Ils sont définis dans le 'header' ● Il n'existe pas d'objets globaux des flots de fichiers (comme std::cin et std::cout), il faut les définir nous même avant utilisation : std::ifstream f1("input.txt"); L'objet de flot de l'entrée du fichier input.txt std::ofstream f2("output.txt"); L'objet de flot de la sortie vers le fichier output.txt On choisit nous même les noms de nos objets flots
9... Les fichiers ● L'opération d'ouverture du fichier peut échouer – Si le fichier d'entrée n'existe pas, si on n'a pas le droit d'écriture dans le répertoire pour le fichier de sortie,... – Il faut tester le résultat d'ouverture: ● L'opération d'entrée du fichier peut échouer – Si nous sommes arrivées a la fin du fichier et il n'y plus des données à l ire – Il est préférable de le tester avant chaque opération d'entrée: if (! f1.is_open() { std::cerr << "Cannot open file"); exit(1); } if ( ! f1.eof() ) f1 >>... ;
10 La sortie dans un fichier #include int main () { int i = 1; float f = 2.3; std::string s = "abcd"; std::ofstream flot("fichier.txt"); if ( ! flot.is_open() ) { std::cerr << "Fichier n'est pas ouvert !!!" << std::endl; return 1; } flot << i << " " << f << " " << s << std::endl; return 0; } > exo.exe > more fichier.txt abcd
11 L'entrée d'un fichier #include int main () { int i; float f; std::string s; std::ifstream flot("fichier.txt"); if ( ! flot.is_open() ) { std::cerr << "Fichier n'est pas ouvert !!!" << std::endl; return 1; } if ( ! flot.eof() ) flot >> i; if ( ! flot.eof() ) flot >> f; if ( ! flot.eof() ) flot >> s; std::cout << " i=" << i << " f=" << f << " s=" << s << std::endl; return 0; } > exo.exe i=1 f=2.3 s=abcd
12 Les manipulateurs ● Les objets spéciaux qui injectent des modifications de comportement sur les flots; – endl – ends – ws – dec – hex – fixed – scientific – setw(val) – setprecision(val) – left – right –... – Insérer un caractère « new line » dans le flot – Insérer un caractère de fin de string dans le flot – Lire et ignore les séparateurs (« white-spaces ») – Écrire et lire en format décimal (défaut) – Écrire et lire en format hexadécimal – Utiliser la notation décimale (en virgule fixe) – Utiliser la notation scientifique (avec exposant) – Régler la largeur de champ I/O pour val – Régler val pour la nouvelle valeur pour la précision – Ajuster la valeur à gauche – Ajuster la valeur à droite std::cout << std::hex << mon_numero << std::endl; manipulateurs