-
Nicolas M. Thiéry authoredNicolas M. Thiéry authored
jupytext:
text_representation:
extension: .md
format_name: myst
format_version: 0.13
kernelspec:
display_name: C++17
language: C++17
name: xcpp17
rise:
auto_select: first
autolaunch: false
centered: false
controls: false
enable_chalkboard: true
height: 100%
margin: 0
maxScale: 1
minScale: 1
scroll: true
slideNumber: true
start_slideshow_at: selected
transition: none
width: 90%
+++ {"slideshow": {"slide_type": "slide"}}
Lecture et écriture dans des chaînes de caractères
+++ {"slideshow": {"slide_type": "notes"}}
Nous avons vu comment lire et écrire facilement des valeurs de types divers (entiers, flottants) dans un fichier texte. Sous le capot cela a requis des opérations de natures différentes :
- interactions avec le système pour lire et écrire du texte dans un fichier
- conversions de valeurs en texte et réciproquement
Ne pourrait-on pas utiliser ce deuxième point pour lire et écrire des valeurs dans des chaînes de caractères? Après tout, elles contiennent du texte elles aussi! Allons-y.
+++ {"slideshow": {"slide_type": "fragment"}}
Au préalable, nous aurons besoin de la bibliothèque suivante :
---
slideshow:
slide_type: fragment
---
#include <sstream>
using namespace std;
+++ {"slideshow": {"slide_type": "slide"}}
Lecture depuis une chaîne de caractères
+++ {"slideshow": {"slide_type": "fragment"}}
Exemple
+++ {"slideshow": {"slide_type": "fragment"}}
La chaîne de caractère suivante contient -- sous forme de texte -- plusieurs nombres :
---
slideshow:
slide_type: fragment
---
string s = "1 2 4 8 16";
Comment extraire ces nombres de s
?
+++ {"slideshow": {"slide_type": "notes"}}
On souhaiterait extraire ces nombres en les convertissant en entiers.
Pour cela on créé un flux de type istringstream
(pour flux entrant
depuis une chaîne de caractères) rattaché à s
:
---
slideshow:
slide_type: fragment
---
istringstream flux = istringstream(s)
+++ {"slideshow": {"slide_type": "fragment"}}
Maintenant il est possible de lire le premier nombre, en procédant comme s'il était dans un fichier :
---
slideshow:
slide_type: fragment
---
int i;
---
slideshow:
slide_type: fragment
---
flux >> i;
i
+++ {"slideshow": {"slide_type": "fragment"}}
Lorsque l'on effectue de nouvelles lectures, les nombres suivants sont lus un à un :
---
slideshow:
slide_type: fragment
---
flux >> i;
i
---
slideshow:
slide_type: fragment
---
flux >> i;
i
---
slideshow:
slide_type: fragment
---
flux >> i;
i
+++ {"slideshow": {"slide_type": "slide"}}
L'exemple suivant illustre que l'on peut lire successivement des valeurs de types mixtes, qu'un nombre quelconque d'espaces sert de séparateur, et que l'on peut enchaîner ces lectures :
---
slideshow:
slide_type: fragment
---
string s = "truc 33 bidule 2.5 reste"
---
slideshow:
slide_type: fragment
---
istringstream flux = istringstream(s);
---
slideshow:
slide_type: fragment
---
string a, b;
int i;
float f;
---
slideshow:
slide_type: fragment
---
flux >> a >> i >> b >> f;
---
slideshow:
slide_type: fragment
---
a
---
slideshow:
slide_type: fragment
---
b
---
slideshow:
slide_type: fragment
---
i
---
slideshow:
slide_type: fragment
---
f
+++ {"slideshow": {"slide_type": "slide"}}
Syntaxe et sémantique
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Syntaxe
istringstream flux = istringstream(s);
flux >> variable1;
flux >> variable2;
...
:::
+++ {"slideshow": {"slide_type": "fragment"}}
:::{admonition} Sémantique
Affecte aux variables variable1
, variable2
, ... les valeurs lues
successivement depuis la chaîne de caractères s
, en tenant compte de
leurs types respectifs.
:::
+++ {"slideshow": {"slide_type": "slide"}}
Écriture dans une chaîne de caractères
Réciproquement, on peut souhaiter écrire le contenu de variables non pas directement à l'écran ou dans un fichier mais dans une chaîne de caractères. Le principe sera le même que pour une lecture.
+++ {"slideshow": {"slide_type": "fragment"}}
Exemple
+++ {"slideshow": {"slide_type": "fragment"}}
On commence par définir un flux de type ostringstream
(pour flux
sortant vers une chaîne de caractères) :
---
slideshow:
slide_type: fragment
---
ostringstream flux;
+++ {"slideshow": {"slide_type": "fragment"}}
Nous pouvons maintenant écrire dans ce flux :