Fonctions d'entrée et de sortie dans C

Bonjour à tous, futurs programmeurs ! Aujourd'hui, nous allons entreprendre un voyage passionnant à travers le monde des entrées et sorties (I/O) dans la programmation C. En tant que votre enseignant bienveillant en informatique, je suis là pour vous guider à travers cet aspect essentiel du codage. Alors, sortez vos cahiers virtuels, et plongeons dedans !

C - Input & Output

Les fichiers standards en C

Avant de commencer à taper frénétiquement sur nos claviers, parlons de quelque chose de fondamental : les fichiers standards en C. Vous savez, lorsque vous exécutez un programme C, il ouvre automatiquement trois fichiers pour vous. C'est comme avoir trois assistants utiles prêts à gérer la communication de votre programme avec le monde extérieur.

  1. stdin (Entrée standard)
  2. stdout (Sortie standard)
  3. stderr (Erreur standard)

Ces fichiers sont les passerelles de votre programme vers l'utilisateur et le système. Pensez à stdin comme les oreilles de votre programme, stdout comme sa bouche, et stderr comme son moyen de crier lorsque quelque chose ne va pas. Génial, non ?

Types de fonctions d'entrée et de sortie

Maintenant, parlons des outils que nous utilisons pour interagir avec ces fichiers. En C, nous avons deux principaux types de fonctions I/O :

  1. Fonctions I/O non formatées
  2. Fonctions I/O formatées

Les fonctions non formatées traitent les données brutes, tandis que les fonctions formatées nous permettent de spécifier le format de nos données. C'est comme la différence entre manger du riz brut (non formaté) et un repas gastronomique magnifiquement présenté (formaté). Les deux font le travail, mais l'un vous donne plus de contrôle sur la présentation !

Fonctions d'entrée et de sortie de caractères non formatées : getchar() et putchar()

Commençons par du simple avec les I/O de caractères non formatées. Rencontrons nos deux premières fonctions : getchar() et putchar().

getchar()

getchar() lit un seul caractère de l'entrée standard (généralement votre clavier). C'est comme un auditeur patient attendant que vous tapiez un seul caractère.

#include <stdio.h>

int main() {
char ch;
printf("Entrez un caractère : ");
ch = getchar();
printf("Vous avez entré : ");
putchar(ch);
return 0;
}

Dans cet exemple, getchar() attend que vous tapiez un caractère et le stocke dans ch. C'est si simple, mais tellement puissant !

putchar()

putchar() est le counterpart de getchar(). Il sort un seul caractère vers la sortie standard (généralement votre écran). C'est comme un crieur public annonçant une lettre à la fois.

#include <stdio.h>

int main() {
char ch = 'A';
printf("Imprimant un caractère : ");
putchar(ch);
return 0;
}

Ici, putchar(ch) affiche le caractère 'A' sur votre écran. Simple et efficace !

Fonctions d'entrée et de sortie de chaînes formatées : gets(), fgets(), puts(), et fputs()

Maintenant, passons au niveau supérieur et parlons de l'I/O de chaînes. Ces fonctions gèrent des chaînes entières, pas seulement des caractères simples.

gets() et fgets()

gets() lit une ligne de stdin dans un tampon. Cependant, il est considéré comme non sûr car il ne vérifie pas le déborder de tampon. C'est pourquoi nous préférons son cousin plus sûr, fgets().

#include <stdio.h>

int main() {
char name[50];
printf("Entrez votre nom : ");
fgets(name, sizeof(name), stdin);
printf("Bonjour, %s", name);
return 0;
}

Dans cet exemple, fgets() lit une ligne de texte (votre nom) dans le tableau name. C'est plus sûr car nous spécifions le nombre maximum de caractères à lire.

puts() et fputs()

puts() écrit une chaîne vers stdout et ajoute une nouvelle ligne. Son counterpart de flux de fichier est fputs().

#include <stdio.h>

int main() {
char greeting[] = "Bonjour, le monde!";
puts(greeting);  // Sortie : Bonjour, le monde! (avec un saut de ligne)
fputs(greeting, stdout);  // Sortie : Bonjour, le monde! (sans saut de ligne)
return 0;
}

puts() ajoute automatiquement un saut de ligne, tandis que fputs() vous donne plus de contrôle.

Fonctions d'entrée et de sortie formatées : scanf() et printf()

Maintenant, nous en arrivons aux gros calibres de l'I/O en C : scanf() et printf(). Ces fonctions sont comme les couteaux suisses de l'I/O - polyvalentes et puissantes.

scanf()

scanf() lit un entrée formatée de stdin. C'est comme un mangeur difficile qui n'accepte que la nourriture préparée exactement comme spécifié.

#include <stdio.h>

int main() {
int age;
float height;
printf("Entrez votre âge et votre taille : ");
scanf("%d %f", &age, &height);
printf("Vous avez %d ans et %.2f mètres de taille.\n", age, height);
return 0;
}

Ici, scanf() lit un entier (%d) et un flottant (%f) de l'entrée. Le & devant age et height est crucial - il indique à scanf() où stocker les valeurs.

printf()

printf() est le counterpart de scanf() pour la sortie. C'est comme un maître conteur, tissant vos données dans des chaînes formatées magnifiques.

#include <stdio.h>

int main() {
int apples = 5;
float price = 0.75;
printf("J'ai %d pommes, chacune coûtant $%.2f.\n", apples, price);
return 0;
}

Dans cet exemple, printf() formate nos données en une phrase lisible.

Spécificateurs de format en C

Les spécificateurs de format sont la sauce secrète qui rend scanf() et printf() si puissants. Ils sont comme des instructions indiquant à ces fonctions comment interpréter ou présenter les données.

Voici un tableau pratique des spécificateurs de format courants :

Spécificateur Type de données
%d Entier
%f Flottant
%c Caractère
%s Chaîne
%lf Double
%x Hexadécimal
%o Octal
%p Pointeur

Souvenez-vous, vous pouvez modifier ces spécificateurs. Par exemple, %.2f imprime un flottant avec 2 décimales, et %5d imprime un entier dans une largeur de champ de 5 caractères.

Et voilà, les amis ! Nous avons couvert les bases des entrées et sorties en C. Souvenez-vous, la pratique rend parfait. Alors, sortez et commencez à coder ! Qui sait ? Peut-être que vous créerez la prochaine grande chose en technologie. Jusqu'à la prochaine fois, bon codage !

Credits: Image by storyset