Skip to content

Les flux ​

De nouveaux opérateurs font leur entrée, appelés flux (stream), représentés par les symboles << et >>.

Ils permettent de gérer un flux de données entre des entités, et la donnée se dirige dans le sens des flèches.

a << b;: b va vers a

a >> b;: a va vers b

Entrées/sorties ​

En C, pour afficher et demander des informations dans la console, nous utilisions printf et scanf.

Désormais nous utiliserons les entrées et sorties de la bibliothèque standard.

Il est nécessaire d’inclure <iostream>

Sorties ​

Pour afficher des messages dans la console, on utilisera la sortie standard. Voici comment fonctionne la sortie avec std::cout

cpp
#include <iostream>

int main()
{

    // On peut afficher une chaine de caractère
    std::cout << "Bonjour" << std::endl;
    // printf("Bonjour\n");

    // Ou bien un caractère seul.
    std::cout << 'A' << std::endl;

    // Ou bien un chiffre.
    std::cout << 7 << std::endl;

    // Ou bien une variable
    int temperature = 25;
    std::cout << temperature << std::endl;

    // On peut aussi les combiner
    std::cout << "Il fait " << temperature << " degrées" << std::endl;
    // printf("Il fait  %d degrées\n", temperature);

    return 0;
}

Pour sauter des lignes, nous utilisons std::endl (équivalent de \n )

Et plus besoin de se rappeler les codes des types de variables avec printf !

Entrées ​

Pour les entrées nous utiliserons l'entrée standard avec std::cin en changeant le sens des crochets >>

cpp

#include <iostream>

int main()
{
    std::cout << "Entre ton age : " << std::endl;
    int age = 0;
    std::cin >> age;
    std::cout << "Tu as " << age << " ans.\n";

    return 0;
}

Pour les chaines de caractères, utiliser std::getline

cpp

#include <iostream>

int main()
{
    std::string phrase;
    std::getline(std::cin, phrase);
    std::cout << phrase;

    return 0;
}

Pour savoir dans quel sens placer les flèches, il suffit de se demander dans quel sens va l'information:

  • std::cout << "hello";: "hello" va vers cout (sortie)
  • std::cin >> variable;: cin (entrée) va vers variable

Fichiers ​

Pour lire et écrire dans des fichiers, nous utiliserons std::ifstream et std::ofstream

Lecture ​

cpp
#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream file("example.txt"); // ouverture de fichier en lecture
    if (!file.is_open()) {             // verification qu'il s'est bien ouvert
        std::cerr << "Erreur lors de l'ouverture du fichier." << std::endl;
        return 1;
    }

    std::string line;
    while (std::getline(file, line)) {  // lecture ligne par ligne
        std::cout << line << std::endl;
    }

    file.seekg(0, std::ios::beg);       // deplacement du curseur au debut

    char c;
    while (file.get(c)) {  // lecture lettre par lettre
        std::cout << c;
    }

    file.close();                       // Fermeture du fichier
    return 0;
}

Ecriture ​

cpp
#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("output.txt");  // ouverture de fichier en ecriture
    if (!file.is_open()) {
        std::cerr << "Erreur lors de l'ouverture du fichier." << std::endl;
        return 1;
    }

    file << "Ceci est une ligne de texte." << std::endl; // ecriture dans le fichier
    file << "Ceci est une autre ligne de texte." << std::endl;

    file.close();
    return 0;
}

Attention, par défaut ici on va écraser le contenu du fichier. Tout le contenu precedent sera perdu.

Si on veut rajouter du contenu à la fin, on écrira:

cpp
std::ofstream file("output.txt", std::ios::app); // append

Gestions des erreurs des entrées ​

Avec le code suivant, si on tape une chaine de caractère au lieu d’un entier, on aura un problème pour taper son nom:

cpp
#include <iostream>
#include <string>

int main()
{
    std::cout << "Entre ton age : ";
    unsigned int age = 0;

    std::cin >> age;
    std::cout << "Tu as " << age << " ans.\n";
    std::cout << "Entre ton nom : ";
    std::string nom = "";
    std::cin >> nom;
    std::cout << "Tu t'appelles " << nom << ".\n";

    return 0;
}

La solution réside dans l’exemple suivant, qui va tester si l’entrée s’est bien passée, et remettre a zero cin autrement

cpp

#include <iostream>
#include <limits>
#include <string>

template <typename T>
void input(T &var)
{
    while (!(std::cin >> var))
    {
        std::cout << "Il y a eu une erreur, recommencer:" << std::endl;
        std::cin.clear();                                                   // On remet std::cin dans un état fonctionnel.
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // On vide les caractères mémorisés.
    }
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // On vide les caractères mémorisés.
}

int main()
{
    unsigned int age = 0;

    std::cout << "Entre ton age : ";
    input(age);
    std::cout << "Ton age " << age << std::endl;

    return 0;
}