cin
(lukeminen)
ja cout
(tulostaminen).
Oletuksena lukeminen tarkoittaa,
että käyttäjä antaa tietoa,
ja tulostaminen tarkoittaa,
että tietoa tulostetaan näytölle.
Kuitenkin standardivirtoihin voi ohjata myös tiedostoja.
Esimerkiksi kun Linuxissa ohjelman käynnistää näin,
tietoa luetaan tiedostosta syote.txt
eikä käyttäjältä:
./koodi < syote.txtVastaavasti tulostuksen voi ohjata tiedostoon
tuloste.txt
näin:
./koodi > tuloste.txtOn myös mahdollista yhdistää nämä ohjaukset näin:
./koodi < syote.txt > tuloste.txt
int a, b; cin >> a >> b;pystyy lukemaan kaksi kokonaislukua molemmista seuraavista syötteistä:
99 123
99 123Jos luettavien alkioiden määrä ei ole tiedossa etukäteen, seuraavanlainen koodi on kätevä:
int x; while (cin >> x) { cout << "luettiin luku " << x << "\n"; }Tämä koodi lukee virrasta kokonaislukuja yksi kerrallaan muuttujaan
x
, kunnes niitä ei enää tule
(esimerkiksi jos virtaan on ohjattu tiedosto ja tiedosto päättyy).
Funktio getline
lukee virrasta merkkijonoon
kokonaisen rivin, mukaan lukien välilyönnit.
Esimerkiksi seuraava koodi lukee virrasta
rivin muuttujaan s
:
string s; getline(cin, s);
#include <iomanip>Tulostuksen muotoiluun pystyy vaikuttamaan lähettämällä virtaan manipulaattoreita ennen tulostettavaa alkiota. Esimerkiksi manipulaattori
setw
määrittää
seuraavaksi tulostettavan alkion kentän leveyden:
for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 5; j++) { cout << setw(4) << i*j; } cout << "\n"; }
1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25Manipulaattori
setfill
määrittää,
millä merkillä kentän alkuosa täytetään.
Esimerkiksi seuraava koodi tulostaa kellonajan muodossa
08:30:00
:
int h = 8, m = 30, s = 0; cout << setfill('0'); cout << setw(2) << h << ":"; cout << setw(2) << m << ":"; cout << setw(2) << s << "\n";Liukulukujen kanssa käteviä manipulaattoreita ovat
fixed
ja setprecision
.
Kun virtaan lähetetään ensin manipulaattori fixed
,
tämän jälkeen manipulaattorin setprecision
avulla
voi määrittää, monenko desimaalin tarkkuudella seuraavat
alkiot tulostetaan.
double x = 3.141592653589793; cout << fixed; cout << setprecision(0) << x << "\n"; // 3 cout << setprecision(2) << x << "\n"; // 3.14 cout << setprecision(5) << x << "\n"; // 3.14159Huomaa, että
setw
vaikuttaa vain seuraavaksi
tulostettavaan alkioon, mutta muut yllä esitellyt manipulaattorit
vaikuttavat kaikkeen tulostukseen siitä lähtien.
#include <fstream>Tiedostovirta
ifstream
lukee tietoa
annetusta tiedostosta.
Esimerkiksi seuraava koodi lukee kaksi kokonaislukua
tiedostosta syote.txt
:
ifstream f("syote.txt"); int a, b; f >> a >> b; f.close();Vastaavasti tiedostovirta
ofstream
tulostaa tietoa annettuun tiedostoon.
Esimerkiksi seuraava koodi tulostaa rivin "Moikka!"
tiedostoon tuloste.txt
.
ofstream f("tuloste.txt"); f << "Moikka!\n"; f.close();Oletuksena tiedosto tyhjentyy ennen tulostamisen aloittamista. Kuitenkin parametrin
ios::app
(append)
avulla voi määrittää,
että uusi tieto tulostetaan tiedoston loppuun:
ofstream f("tuloste.txt", ios::app);
#include <sstream>Merkkijonovirran avulla merkkijonossa olevaa tietoa voi lukea muuttujiin. Esimerkiksi seuraava koodi luo merkkijonovirran ja lukee sen avulla kaksi kokonaislukua.
string s = " 99 123 "; stringstream ss(s); int a, b; ss >> a >> b; cout << a << " " << b << "\n"; // 99 123Seuraava koodi puolestaan muodostaa merkkijonovirran avulla merkkijonon, jossa on liukuluku esitettynä kahden desimaalin tarkkuudella.
stringstream ss; double x = 3.141592653589793; ss << fixed << setprecision(2) << x; string s = ss.str(); cout << s << "\n"; // 3.14