Programmation en C++ IO en C++/SL
Sortie à l’écran Exemple: Indispensable pour utiliser les IO de SL Comme pour tous les composants SL, il faut toujours se placer dans l’espace de nommage std:: #include <iostream> int main () { std::cout << "Bonjour" << std::endl; return 0; } L’objet std::cout représente le flot vers l’écran On peut cascader les sorties L’objet std::endl effectue deux opérations: 1. Retour chariot 2. Vidage du buffer L’opérateur << signifie Envoie dans …
La classe A pour la quelle l’opérateur << est défini Sorties L’opérateur << est intelligent: il s’adapte au type de l’objet placé à sa droite #include “A.h” #include <iostream> #include <string> int main () { int i = 1; float f = 2.3; std::string s = "abcd"; A a; std::cout << " i=" << i << " f=" << f << " s=" << s << " a=" << a << std::endl; return 0; } La classe A pour la quelle l’opérateur << est défini
Entrées du clavier std::ws saute les séparateurs On utilise le flot std::cin et l’opérateur >> (qui signifie toujours "envoie dans… ") Les entrées en cascade sont séparées par tous les caractères de séparation (espace, tabulation, CR) Utilisation d’opérateurs sur les flots std::ws saute les séparateurs Pour les chaînes de caractères qui pourraient contenir des séparateurs il faut analyser soi-même les lignes #include <iostream> #include <string> int main () { int i = 1; double d = 2.3; std::string s = "abcd"; std::cin >> i >> d >> std::ws; std::getline (std::cin, s); std::cout << "[" << i << d << s << "]" << std::endl; return 0; } > exo3.exe 1 2 Un texte [12Un texte]
Les fichiers On utilise les flots std::ifstream et std::ofstream Les opérateurs << et >> Ouverture d’un fichier Écriture Fermeture Obligatoire: le destructeur du flot ne ferme pas le fichier #include <fstream> #include <string> int main () { int i = 1; double d = 2.3; std::string s = "abcd efgh"; std::ofstream f ("fichier.txt"); if (f.is_open()) f << i << " " << d << std::endl; f << s << std::endl; f.close (); } return 0;
Les fichiers (suite) Lecture Toujours tester la fin de fichier (eof ~ end of file) En général, il sera nécessaire de traiter la syntaxe manuellement, après lecture ligne à ligne des entrées #include <iostream> #include <fstream> #include <string> int main () { int i; double d; std::string s; std::ifstream f ("fichier.txt"); if (f.is_open ()) if (!f.eof ()) f >> i; if (!f.eof ()) f >> d; if (!f.eof ()) f >> std::ws; if (!f.eof ()) std::getline (f, s); f.close (); } std::cout << "[" << i << d << s << "]" << std::endl; return 0;
Les flots bufferisés Utilise les flots std::istringstream et std::ostringstream et les opérateurs << et >> Toutes les opérations s’effectuent dans un std::string dynamique On peut convertir ces flots en std::string Par le constructeur [i] Par la fonction str()[o] #include <iostream> #include <fstream> #include <sstream> #include <string> int main () { int i; double d; std::string s; std::string input = "123 1.23 abcd def"; std::istringstream b (input); b >> i >> d >> std::ws; std::getline (b, s); std::cout << "[" << std::hex << i << d << s << "]" << std::endl; return 0; }
Les manipulateurs 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 la fin du 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 int i = 1234; std::cout << hex << i << std::endl;