Comprendre comment un programme reçoit des données, les traite, et communique ses résultats.
Un programme est comme une recette de cuisine : il reçoit des ingrédients (les données), suit des étapes (le code), et produit un plat (le résultat).
Tout programme, quelle que soit sa complexité, suit toujours le même schéma de base : recevoir → traiter → communiquer.
Le programme reçoit des informations
L'utilisateur tape quelque chose, un fichier est lu, une valeur est fournie…
Le programme traite ces informations
Il effectue des calculs, des comparaisons, des transformations.
Le programme communique ses résultats
Il affiche un résultat, enregistre un fichier, ou signale une erreur.
Pense à un distributeur automatique : tu insères une pièce (entrée), la machine traite ta commande (traitement), et te donne le produit ou affiche une erreur (sortie ou erreur).
Un programme communique avec le monde extérieur via trois canaux, appelés flux standards. Chaque flux a un rôle précis et une couleur différente dans ce cours :
Sortie normale et erreur sont deux canaux séparés. Ils peuvent être redirigés indépendamment dans un terminal. Ce n'est pas la même chose !
L'entrée standard (stdin) est le moyen qu'a un programme pour recevoir des informations. En mode console, c'est ce que l'utilisateur tape au clavier. On peut aussi fournir des données depuis un fichier.
1// Node.js — lecture d'une entrée via readline 2const readline = require('readline'); 3 4const rl = readline.createInterface({ 5 input: process.stdin, // ← flux d'entrée 6 output: process.stdout 7}); 8 9rl.question('Quel est ton prénom ? ', (prenom) => { 10 // prenom contient ce que l'utilisateur a tapé 11 console.log(`Bonjour, ${prenom} !`); 12 rl.close(); 13});
1// PHP — lecture depuis stdin 2<?php 3 4// Afficher une question 5echo 'Quel est ton prénom ? '; 6 7// Lire la réponse depuis l'entrée standard 8$prenom = trim(fgets(STDIN)); // ← flux d'entrée 9 10echo "Bonjour, $prenom !\n";
1// C# — lecture depuis stdin 2using System; 3 4Console.Write("Quel est ton prénom ? "); 5 6// Console.ReadLine() lit depuis stdin 7string prenom = Console.ReadLine(); // ← flux d'entrée 8 9Console.WriteLine($"Bonjour, {prenom} !");
La lecture se fait toujours depuis un flux : process.stdin, STDIN, ou Console.ReadLine(). Ce sont trois façons différentes de dire "lis ce que l'utilisateur a tapé".
La sortie standard (stdout) est utilisée pour afficher les résultats normaux d'un programme. C'est ce que l'utilisateur voit s'afficher dans le terminal lorsque tout se passe bien.
1// JavaScript — écrire sur stdout 2 3// Méthode habituelle 4console.log('Résultat : 42'); 5 6// Écriture directe sur stdout (sans saut de ligne automatique) 7process.stdout.write('Chargement...'); 8 9// Exemple complet 10const score = 98; 11console.log(`Ton score : ${score}/100`); // → stdout
1// PHP — écrire sur stdout 2<?php 3 4// echo écrit directement sur stdout 5echo "Résultat : 42\n"; 6 7// Autre façon 8fwrite(STDOUT, "Chargement...\n"); 9 10// Exemple complet 11$score = 98; 12echo "Ton score : $score/100\n"; // → stdout
1// C# — écrire sur stdout 2using System; 3 4// WriteLine ajoute un saut de ligne 5Console.WriteLine("Résultat : 42"); 6 7// Write n'ajoute pas de saut de ligne 8Console.Write("Chargement..."); 9 10// Exemple complet 11int score = 98; 12Console.WriteLine($"Ton score : {score}/100"); // → stdout
Write (ou process.stdout.write) écrit sans aller à la ligne. WriteLine (ou console.log, echo) écrit et passe automatiquement à la ligne suivante.
La sortie d'erreur (stderr) est un flux séparé de stdout, dédié aux messages d'erreur et d'avertissement. Même si les deux s'affichent dans le terminal par défaut, ils peuvent être redirigés indépendamment.
Si tu envoies le résultat d'un programme vers un fichier (monprog > résultats.txt), les erreurs s'affichent quand même dans le terminal grâce à stderr. Le fichier reste propre et ne contient que les vrais résultats.
1// JavaScript — écrire sur stderr 2 3// console.error → stderr (s'affiche en rouge dans de nombreux terminaux) 4console.error('Erreur : fichier introuvable !'); 5 6// Écriture directe 7process.stderr.write('Problème critique\n'); 8 9// Exemple complet : sortie normale + erreur séparées 10const age = -5; 11if (age < 0) { 12 console.error(`Erreur : l'âge ne peut pas être négatif (reçu: ${age})`); 13} else { 14 console.log(`Âge valide : ${age} ans`); 15}
1// PHP — écrire sur stderr 2<?php 3 4// Écriture directe sur STDERR 5fwrite(STDERR, "Erreur : fichier introuvable !\n"); 6 7// Exemple complet 8$age = -5; 9if ($age < 0) { 10 fwrite(STDERR, "Erreur : l'âge ne peut pas être négatif (reçu: $age)\n"); 11} else { 12 echo "Âge valide : $age ans\n"; 13}
1// C# — écrire sur stderr 2using System; 3 4// Console.Error → stderr 5Console.Error.WriteLine("Erreur : fichier introuvable !"); 6 7// Exemple complet 8int age = -5; 9if (age < 0) { 10 Console.Error.WriteLine($"Erreur : l'âge ne peut pas être négatif (reçu: {age})"); 11} else { 12 Console.WriteLine($"Âge valide : {age} ans"); 13}
Un récapitulatif visuel des trois flux dans les trois langages :
| Flux | Rôle | JS Node.js | PHP | C# |
|---|---|---|---|---|
| stdin | Lire une entrée | process.stdin rl.question() |
STDIN fgets(STDIN) |
Console.ReadLine() |
| stdout | Résultat normal | console.log() process.stdout.write() |
echo fwrite(STDOUT, …) |
Console.WriteLine() Console.Write() |
| stderr | Messages d'erreur | console.error() process.stderr.write() |
fwrite(STDERR, …) | Console.Error.WriteLine() |
1const readline = require('readline'); 2const rl = readline.createInterface({ input: process.stdin }); 3 4rl.question('Entrez un nombre positif : ', (saisie) => { 5 const nombre = Number(saisie); // conversion texte → nombre 6 7 if (isNaN(nombre) || nombre <= 0) { 8 // ← stderr : signale le problème 9 console.error('Erreur : ce n\'est pas un nombre positif !'); 10 } else { 11 // ← stdout : affiche le résultat 12 console.log(`Le double de ${nombre} est : ${nombre * 2}`); 13 } 14 rl.close(); 15});
1<?php 2echo 'Entrez un nombre positif : '; 3 4// ← stdin : lecture de l'entrée 5$saisie = trim(fgets(STDIN)); 6$nombre = (float) $saisie; 7 8if (!is_numeric($saisie) || $nombre <= 0) { 9 // ← stderr 10 fwrite(STDERR, "Erreur : ce n'est pas un nombre positif !\n"); 11} else { 12 // ← stdout 13 echo "Le double de $nombre est : " . ($nombre * 2) . "\n"; 14}
1using System; 2 3Console.Write("Entrez un nombre positif : "); 4 5// ← stdin 6string saisie = Console.ReadLine(); 7 8if (!double.TryParse(saisie, out double nombre) || nombre <= 0) { 9 // ← stderr 10 Console.Error.WriteLine("Erreur : ce n'est pas un nombre positif !"); 11} else { 12 // ← stdout 13 Console.WriteLine($"Le double de {nombre} est : {nombre * 2}"); 14}
Trois exercices pour pratiquer. Commence par le premier, puis avance à ton rythme.
Écris un programme qui demande le prénom de l'utilisateur, puis affiche un message de bienvenue personnalisé sur la sortie standard.
Demande deux nombres à l'utilisateur, puis effectue leur addition. Si l'utilisateur entre une valeur non numérique, affiche un message d'erreur sur stderr.
isNaN() en JS, is_numeric() en PHP, double.TryParse() en C#.Le programme demande une température en Celsius et un choix de conversion. Il affiche le résultat sur stdout. Si la température saisie est en dehors de la plage physiquement possible (< −273,15 °C), il signale une erreur sur stderr.
Un des grands avantages d'avoir des flux séparés : tu peux les rediriger indépendamment depuis le terminal, sans toucher au code.
Imagine un programme qui traite des milliers de lignes. Tu veux garder les résultats dans un fichier, mais voir les erreurs à l'écran en temps réel. La redirection le permet en une seule commande.
2 désigne le flux erreurDans un système, chaque flux a un numéro : 0 = stdin, 1 = stdout, 2 = stderr. C'est pourquoi on écrit 2> pour rediriger les erreurs.
Les commandes de redirection sont les mêmes dans le terminal, peu importe le langage :
Tente les exercices par toi-même avant de regarder les solutions. C'est en faisant des erreurs qu'on apprend le mieux.
Six questions pour valider ce que tu as appris. Clique sur la réponse que tu penses correcte.
Tout programme = Entrée → Traitement → Sortie. Ce schéma s'applique en JS, PHP, C#, Python, Java, et dans tous les langages que tu rencontreras.