Piège de l'opérateur >> attention aux blancs !

Contenu du snippet

En modes texte et binaire, les WS (White space) sont automatiquement consommés ce qui provoque parfois des surprises
Toutefois, nous avons le pouvoir de contrôler cela

pout tester : essayer de mettre des blancs ou tabulations dans votre texte...

Source / Exemple :


#include <iostream>
using namespace std;
//piège de l'opérateur >>

void main()
{//attention aux blancs !
	char buffer[80]={0};//pratique pour mettre à zéro tout le tableau
	cout << "entrer une phrase de moins de 80 caracteres:" << endl;
	cin >> buffer;
	cout << "voici ce que j'ai compris (car je m'arrete au premier blanc) :" << endl;
	cout << buffer << endl;
	cout << "mais le reste n'est pas perdu :" << endl;
	cin.getline(buffer, 80);
	cout << buffer << endl;
	//lecture par caractère
	char c;
	cout << endl << "lecture par caracteres (un par un)" << endl
		 << "entrer des phrases terminees par <ENTREE> " << endl
		 << "mettre des blancs et tabulations dans le texte" << endl
		 << "\t pour terminer : CTRL+Z (un double!):" << endl;
	while (cin >> c)
		cout << c;

	cout << endl << "...je mange les petits blancs !" << endl;

	//cin >> ws;
	cin.unsetf(ios::skipws);//tenir compte des espaces et tabulations
	cout << endl << "remise en bon etat technique du flux" << endl
		<< "cin.good() = " << boolalpha << cin.good() << endl;
	cin.getline(buffer, 80);
	cin.clear();//nécessaire pour remettre le flux dans l'état good
	cout << "apres cin.clear() : cin.good() = " << boolalpha << cin.good() << endl;
	cout << endl << "entrer des phrases terminees par <ENTREE> " << endl
		 << "mettre des blancs et tabulations dans le texte" << endl
		 << "\t pour terminer : CTRL+Z (un simple!):" << endl;
	while (cin >> c)
		cout << c;
	cout << endl;

	cin.clear();//nécessaire pour remettre le flux dans l'état good
//lecture par ligne (plus performant)
	cout << endl << "lecture par lignes entieres" << endl
		 << "entrer des phrases terminees par <ENTREE> " << endl
		 << "mettre des blancs et tabulations dans le texte" << endl
		 << "\t pour terminer : CTRL+Z (un simple!):" << endl;
	while (cin.getline(buffer, 80))
		cout << buffer << endl;
	cout << endl;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.