31
Lecture et écriture de données La communication avec l’extérieur. Lecture de données à partir du clavier. Affichage des données à l’écran. Formatage des données. Parallèle entre les langages C et C++.

Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

Embed Size (px)

Citation preview

Page 1: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

Lecture et écriture de données

La communication avec l’extérieur. Lecture de données à partir du clavier. Affichage des données à l’écran. Formatage des données. Parallèle entre les langages C et C++.

Page 2: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

2

Entrées / sorties avec C Comme le langage PASCAL, C ne renferme pas d’instructions d’entrées / sorties

comme faisant partie du langage. Ainsi, on s’assure de l’indépendance de C avecl’environnement matériel.

Les outils de base sont disponibles dans la librairie stdio. Pour utiliser ces outils,il faut donc inclure cette librairie :

#include <stdio.h>

Affichage d’un caractère à partir du code entier c (un entier entre 0 et 255)représentant ce caractère :

int putchar(c);

La fonction putchar retourne ensuite le code entier c.

Si c est de type char, il est d’abord converti en un entier.

Caractères spéciaux :

\n saut de ligne\t usage du tabulateur

Page 3: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

3

Écriture d’un caractère : exemple #include <stdio.h>

void main(){

char A = 'A';char B = '=';int C = '1';int i;putchar('U');putchar('n');putchar('\t'); // Utilisation du tabulateur.putchar(B);putchar(' ');putchar(C);putchar('\n'); // Saut de ligne.putchar('?');putchar('\n'); // Saut de ligne.i = putchar(225); // Caractère ''.putchar(i - 125); // Caractère 'd'.putchar('\n'); // Saut de ligne.

}

Un = 1?d

Page 4: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

4

Lecture d’un caractère Lecture du prochain caractère du fichier d’entrée standard et retourne le code

entier représentant ce caractère :

int getchar();

#include <stdio.h>

void main(){

char A, B, C, D;int E;A = getchar(); B = getchar(); C = getchar();D = getchar(); E = getchar();putchar(A); putchar(B);putchar('\t'); // Utilisation du tabulateur.putchar(C); putchar(' '); putchar(D);putchar('\n'); // Saut de ligne.putchar(E);putchar('\n'); // Saut de ligne.

}Un = 1?

Un=1?

Page 5: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

5

Lecture formatée de données Syntaxe :

int scanf("format de lecture des données ",adresse de la variable 1,adresse de la variable 2,

…,adresse de la variable n);

Cela détermine commentles données lues doiventêtre interprétées.

Les données lues permettentd’initialiser ces variables.

L’adresse d’une variable estindiquée par le nom de lavariable précédé du signe &.

#include <stdio.h>void main(){

int jour, mois, annee, k;k = scanf("%i %i %i", &jour, &mois, &annee);if(k == 3) {

putchar('O'); putchar('K'); putchar('\n');}

}

Exemple :

Cela lit 3 entiers signés, séparés par des espaces, tabulations ou sauts de ligne.

Retourne le # delectures réussies.

Page 6: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

6

Formatage de données en lecture % * # de caractères lus h ou l L type de conversion

Indique ledébut d’unformatage

Optionnel :Indique quela donnéed’entrée seraignorée.

Optionnel :Indique le # decaractères enentrée(1).

(1) Les données peuvent être saisiessans espaces entre elles.

Optionnel :h = short (d i o u x)l ou L = long (int)

oudouble (float)

d ou i into int (les chiffres sont

assumés en base 8)u unsigned intx int (les chiffres sont

assumés en base 16)c char (l’espace est

inclus)s chaîne de caractères

(excluant l’espace)e, f ou g float (E, e ou . sont

optionnels).

Note : Une suite d’espaces, de tabulateursou de sauts de lignes est équivalentà un espace dans le fichier d’entrée.

Page 7: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

7

Lecture formatée de données Si le format de lecture des données contient des caractères autres que l’espace,

un tabulateur ou une fin de ligne, alors ces symboles doivent être introduitsexactement dans l’ordre indiqué.

#include <stdio.h>void main(){

int jour, mois, annee;int k;k = scanf("%i/%i/%i", &jour, &mois, &annee);if(k == 3) {

putchar('O'); putchar('K'); putchar('\n');}

}

Données valides : 12/4/1980 Données invalides : 12 4 198012/04/1980 12 /4 /1980

scanf s’arrête si le format de lecture a été traité jusqu’au bout ou si une donnéene correspond pas au format indiqué.scanf retourne le # d’arguments correctement reçus et affectés.

Page 8: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

8

Écriture formatée de données Syntaxe : int printf("format d’écriture des données ",

expression 1, expression 2, …, expression n);

Les valeurs de expression 1, expression 2, …, expression n correspondent auxdonnées à afficher et doivent coïncider avec le format d’écriture précédent.

#include <stdio.h>void main(){

int jour, mois, annee;int k;

k = scanf("%i/%i/%i", &jour, &mois, &annee);if(k == 3) printf("jour = %i, mois = %i, annee = %i\n", jour, mois, annee);else printf("Format invalide de donnees en entree.\n");

}

Si le format d’écriture est une chaîne de caractèresuniquement, alors il n’y a pas d’autres paramètres.

Si le nombre n d’expressions est plus élevé que ce qui est prévu dans le formatd’écriture, ces dernières expressions sont ignorées.

Page 9: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

9

Formatage de données en écriture % caractère # minimum précisionh ou l L type

de de decontrôle caractères conversion

à l’impression

Indique ledébut d’unformatage

Optionnel :4 caractèressontdisponibles.

Optionnel :Si cela exige davantagede caractères, les besoinssont comblés.

Optionnel :h = shortl = longL = long double

Optionnel :.n signifie que l’on optepour une précision de nchiffres après le point.

Il s’agit dedéfinir dequelle façonune donnéeserainterprétée.

Page 10: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

10

Formatage de données en écriture Caractères de contrôle :

+ S’assure qu’un signe précède toujours une valeur numérique signée.- Opte pour une justification à gauche avec l’espace comme caractère de remplissage (le mode de justification à droite est celui par défaut).# la lettre O va précéder une valeur en base 8, les lettres Ox ou OX vont précéder une valeur hexadécimale.espace une valeur positive ou nulle sera précédée d’un espace plutôt que d’un

signe +.

Type de conversion :

entiers :

d valeur entière décimale signéeo valeur entière octale non signéeu valeur entière décimale non signéex valeur entière hexadécimale non signée

avec les chiffres a, b, c, d, e, fX idem avec les chiffres A, B, C, D, E, F.

caractères : c un caractères une chaîne de caractères.

réels :

f valeur réelle signéee valeur réelle signée

avec un exposant eE idem mais avec Eg idem à e ou f selon

la précision et ladimension de lavaleur réelle

G idem à g mais avecE s’il y a lieu.

Page 11: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

11

Caractères d’échappement Dans le format d’écriture des données de l’instruction printf, on peut utiliser des

caractères d’échappement :

\a signal sonore\b efface le caractère qui précède le curseur (« backspace »)\n passe à la ligne suivante\t usage du tabulateur\\,%%, \" pour afficher le caractère \, % ou ".

Exemples :

#include <stdio.h>

void main(){

printf("%4d\n%4d\n%4d\n", 123, 1234, 12345);

printf("%f\n%12f\n%.2f\n%5.0f\n%10.3f\n%.4f\n",100.123, 100.123, 100.123, 100.123, 1.23456);

}

123123412345100.123000 100.123000100.12 100 1.2350.0000

Page 12: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

12

Exemple d’entrées / sorties Exemple :

#include <stdio.h>void main(){

int A, B;int k;char caractere;float C = 12.3456f;double D = 12.123456789;long double E = 12.3;

printf("Entrez 2 entiers au clavier : \n");k = scanf("%i %i", &A, &B);while(k != 2) {

printf("Donnees invalides. Recommencez...\n");k = scanf("%i %i", &A, &B);

}printf("%i fois %i est %li\n", A, B, (long) A * B);

Page 13: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

13

Exemple d’entrées / sorties Exemple :

printf("Entrez un caractere : \n");scanf("\n%c", &caractere);printf("Le caractere %c a le code %i.\n", caractere, caractere);

printf("%f %f %f\n", C, D, E);printf("%e %e %e\n", C, D, E);

}

Entrez 2 entiers au clavier :1234 5671234 fois 567 est 699678Entrez un caractere :aLe caractere a a le code 97.12.345600 12.123457 12.3000001.234560e+001 1.212346e+001 1.230000e+001

Page 14: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

14

Généralités sur les flux en C++

Un flux ou canal de données représente un ensemble de données pouvant êtremanipulé à la fois en lecture et en écriture.

Offre une transparence vis-à-vis de la source ou de la destination des donnéesc’est-à-dire

un programme peut utiliser les mêmes instructions de manipulation de fluxpour tous les types de flux de sortie (écran, fichier, mémoire)pour tous les types de flux d’entrée (clavier, fichier, mémoire).

Ex.: Un programme peut utiliser les mêmes instructions pour afficher des données àl’écran ou pour écrire ces données dans un fichier sur le disque dur.

En C++, tous les flux sont représentés par des classes qui font partie de la librairieiostream (input-output stream, pour flux d’entrées/sorties).

#include <iostream.h>

La gestion des flux se caractérise par une lecture/écriture séquentielle desdonnées.

Page 15: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

15

Généralités sur les flux en C++ Ces classes correspondent aux différents types de flux et sont présentées

sous la forme d’une arborescence:

iosclasse de base qui regroupe

les caractéristiques communesaux flux

istream ostreamclasse de base

du flux d’entréeclasse de base du

flux de sortie

ifstream iostream ofstreamflux de sortie

surfichier

flux d’entréesur fichier

canaux standards

Page 16: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

16

Opérateurs d’entrées / sorties en C++

Toutes les classes de la librairie iostream disposent de 2 opérateurs surchargés:<< écrire vers un flux de sortie>> lire à partir d’un flux d’entrée.

L’opérande de gauche de l’opérateur << doit correspondre à un objet de la classeostream (cout par exemple) .

L’opérande de gauche de l’opérateur >> doit correspondre à un objet de la classeistream (cin par exemple).

C++ fournit 4 flux prédéfinis:cout: correspond au flux de sortie standard (écran par défaut)

(dérivée de la classe ostream)cin: désigne le flux d’entrée standard (clavier par défaut)

(dérivée de la classe istream)cerr: désigne la sortie erreur standard (écran par défaut)

(dérivée de la classe ostream)clog: permet à la fois d’envoyer des messages d’erreurs vers la

sortie erreur standard (écran par défaut) et de remplir un fichierde log (fichier d’alerte) (dérivée de la classe ostream)

Page 17: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

17

Surcharge avec les types de données de base

Ces 2 opérateurs << et >> ont été définis pour les types de données suivants:

char, short, int, long, float, double, long double, char * et void *.

On peut donc lire et écrire des variables de ces différents types de donnéesà l’aide de ces 2 opérateurs.

comme par exemple, cout << 'a' << 25;cin >> i ; // i est une variable de type int.

À plus tard.

En C++, les opérations d’entrées / sorties s’effectuent automatiquement enfonction du type de données. S’il n’y a pas concordance, le compilateur génèreune erreur.

En C++, même si les outils d’E/S de C sont disponibles, ne les utilisez pas.

Les opérateurs << et >> peuvent être utilisés en cascade. Ex. : cout << a << b;

Page 18: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

18

Affichage à l’écran avec cout Ex.: #include <iostream.h>

void main(){

int entier = 12; char c = 'A';

cout << "\n\tEntier : " << entier << '\n';cout << "\tCaractere : " << c << endl;

}

saut de ligne

La librairie iostream fournit un certain nombre d’attributs ou de paramètresqui permettent de modifier les caractéristiques d’un flux.

Syntaxe: cout << manipulateur;

Usage du tabulateur

Page 19: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

19

Usage de manipulateurs avec cout

dec Convertir en base décimale hex Convertir en base hexadécimale oct Convertir en base octale ws Supprimer les espaces endl Ajouter un saut de ligne en fin de flux ends Ajouter un caractère de fin de chaîne flush Vide un flux de sortie setbase(int n) Choisir la base (0, 8, 10 et 16). La valeur 0

correspond à la valeur par défaut (décimal). setfill(int c) Choisir le caractère de remplissage (« padding ») setprecision(int n) Indiquer le nombre de chiffres d’un nombre

décimal setw(int n) Définir la largeur du prochain champ de sortie :

facilite l’alignement. Ex. : cout << setw(8);

Manipulateur Objectif

Note : Pour employer un manipulateur de flux paramétré, vous devez inclure :#include <iomanip>.Ex.: endl n’est pas un manipulateur de flux paramétré.

Page 20: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

20

Usage de manipulateurs avec cout Ex.: int Entier = 15;

……..cout << "Conversions" << endl;cout << "Entier : " << Entier << endl;cout << "Hexa : " << hex << Entier << endl;cout << "Oct : " << oct << Entier << endl;cout << dec;

ConversionsEntier : 15Hexa : fOct : 17

On repasse en base décimale.

Page 21: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

21

Usage de manipulateurs avec cout Ex.: float PI = 3.14159;

……..cout << "PI : " << PI << endl;cout << "PI : " << setprecision(3) << PI << endl;cout << "PI : " << setprecision(4) << PI << endl;cout << "PI : " << setprecision(5) << PI << endl;

PI : 3.14159PI : 3.14PI : 3.142PI : 3.1416

Page 22: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

22

Usage de fonctions avec cout

fill() Renvoyer le caractère de remplissage fill(char c) Modifier le caractère de remplissage (valide pas

seulement pour le champ de sortie suivant). L’espace est la valeur par défaut.

precision() Renvoyer la précision pour les nombres décimaux precision(int n) Modifier la précision pour les nombres décimaux setf(long flag) Modifier une propriété de formatage setf(long flag, long champ)

Modifier une propriété de formatage d’un champ d’activité particulier

width() Renvoyer la largeur d’affichage width(int n) Modifier la largeur d’affichage pour le champ de

sortie suivant puis, reprend immédiatement sa valeur par défaut.

Méthode Objectif

Fonctions disponibles dans la classe ios

Page 23: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

23

Usage de fonctions avec cout

#include <iostream.h>void main(){

int i = 123;cout << "i = " << i << "i + 1 = " << i + 1 << endl;cout << "i = ";cout.width(6); cout.fill('0');cout << i;cout << "i + 1 = ";cout << i + 1;cout << "i + 2 = ";cout.width(5);cout << i + 2 << endl;

}

i = 123i + 1 = 124i = 000123i + 1 = 124i + 2 = 00125

Page 24: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

La fonction setf avec cout Ex.: Utilisation de la fonction setf() pour modifier l’alignement des colonnes

affichées i.e. choisir d’aligner à gauche ou à droite les éléments affichés.

cout.setf(ios::right, ios::adjustfield);cout << setw(12) << "AAA" << endl;cout << setw(12) <<   "BBBBBB" << endl;

AAABBBBBB

alignement à droite

sous réserve que lataille d’affichage soit

spécifiée

Alignement à gauche: cout.setf(ios::left, ios::adjustfield);

Note : D’autres options sont disponibles : ios::showpoint afficher les zéros de droite (20.00 au lieu de 20), ios::showpos afficher le signe + devant les nombres positifs, ios::hex afficher le nombre en base 16, ios::scientific afficher une valeur à virgule flottante en notation scientifique, ios::fixed afficher une valeur à virgule flottante en notation à virgule fixe.

Page 25: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

25

La fonction setf avec les paramètres setw et setfill

Ex.: float Decimal = 10.25;……..cout.setf(ios::right, ios::adjustfield);cout <<   "Decimal : "   << setw(8) << Decimal << endl;cout <<   "Decimal : "   << setw(8) << (Decimal + 100) << endl;cout <<   "Decimal : "   << setw(8) << (Decimal+1000) << endl;cout <<   "Decimal : "   << setw(8) << setfill('0') << Decimal << endl;

Decimal : 10.25Decimal : 110.25Decimal : 1010.25Decimal : 00010.25

Page 26: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

26

Saisie au clavier avec cinSaisie au clavier avec cin

L’objet cin est employé pour saisir des informations au clavier.

défini à partir d’une classe dérivée de istream.

utilise l’opérateur surchargé >> pour saisir au clavier les valeurs° des variables de type primaire (char, int, float, etc.)° des chaînes de caractères.

Ex.: int i; char c; float f1, f2;…..cout << "Saisissez un nombre: " ;cin >> i;…..cout << "Saisissez un caractere: " ;cin >> c;

…..cout << "Saisissez 2 nombres reels: " ;cout << "Un espace entre les 2 nombres reels: ";cin >> f1 >> f2;

Page 27: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

27

Saisie au clavier avec cinSaisie au clavier avec cin

Il n’y a pas de contrôle de type au moment de la saisie.

La variable sera considérée invalide uniquement à l’issue de lasaisie.

Il est donc possible de saisir des caractères dans une variable entière.

#include <iostream.h>void main(){

char c;

while (true){

cin >> c;if (c == '.') break;cout << c;

}}

Fait abstraction des espaces.

a c def.acdef

Page 28: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

28

Saisie au clavier avec la fonction get de cinSaisie au clavier avec la fonction get de cin

get avec un paramètre de type char permet d’examiner chaque caractère,y compris les espaces. La fonction retourne un objet de la classe iostream.

char a, b, c;char d, e;cin.get(a).get(b).get(c);cin.get(d) >> e;

#include <iostream.h>void main(){

char c;

while (true){

cin.get(c);if (c == '.') break;cout << c;

}}

a c def. a c def

Note : put permet d’écrire un caractère : cout.put('O').put('h').put('\n');

Page 29: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

29

Saisie au clavier avec les fonctions ignore, peek et putback de cinSaisie au clavier avec les fonctions ignore, peek et putback de cin

La fonction ignore permet d’ignorer les caractères restants sur une ligne.2 paramètres : le nombre maximum de caractères à ignorer et le caractère de fin.

Ex.: cin.ignore(80, '\n');

La fonction peek permet d’examiner sans extraire le prochain caractère.

Ex.: #include <iostream.h>void main(){

char c;while (true){

if( cin.peek() == '.') break;cin >> c;cout << c;

}}

abcdef.abcdef

Page 30: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

30

Saisie au clavier avec les fonctions ignore, peek et putback de cinSaisie au clavier avec les fonctions ignore, peek et putback de cin

#include <iostream.h>void main(){

char c;

while (true){

if( cin.peek() == '.') break;cin.get(c);if ( c == 'b') cin.putback('B');else cout << c;

}}

Exemple :

La fonction putback permet d’insérer un caractère dans le flux d’entrée.

abcbbdef.aBcBBdef

Page 31: Lecture et écriture de données La communication avec lextérieur. Lecture de données à partir du clavier. Affichage des données à lécran. Formatage des

31

Saisie au clavier avec les fonctions ignore, peek et putback de cinSaisie au clavier avec les fonctions ignore, peek et putback de cin

#include <iostream.h>void main(){

char c;

cout << "Entrez une phrase : ";

while (true){

cin.get(c);if ( c == '.') break;if ( c == '!') cin.putback('$');

else cout << c;while (cin.peek() == '#') cin.ignore(1, '#');

}}

Exemple :

Ceci# est!un! essai##!.Ceci est$un$ essai$