Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

17.2 Tiedostojen käsittely C++:n tietovirroilla

Tiedostojen käsittely C++:ssa on vain cin ja cout - tietovirtoja vastaavien tietovirtojen käsittelyä.

Olkoon meillä tiedosto nimeltä luvut.dat:

	13.4
	23.6
	kissa
	1.9
	<EOF>     <-   ei aina välttämättä mikään merkki

Kirjoitetaan esimerkkitiedoston luvut lukeva ohjelma C++:n tietovirroilla. Tarkoitus on hylätä ne rivit, joiden alussa ei ole reaalilukua:

tiedosto\Tied_kaG.cpp - Lukujen lukeminen tiedostosta

	// Ohjelma lukee tiedostosta luvut.dat lukuja ja tulostaa niiden
	// summan ja keskiarvon.  Jos tiedostossa on virheellisiä
	// rivejä, tulostetaan ne. 
	#include <iostream>
	#include <stdio>
	#include <fstream>     // File stream
	#include <string>
	using namespace std;
	
	int main(void)
	{
	  double luku,summa,ka;
	  string s;
	  int n;
	
	  ifstream fi("luvut.dat");
	  if ( !fi ) {
	    cout << "Tiedosto ei aukea!" << endl;
	    return 1;
	  }
	
	  summa = 0.0;
	  n     = 0;
	  ka    = 0.0;
	
	  while ( getline(fi,s) ) {
	    if ( sscanf(s.c_str(),"%lf",&luku) <= 0 ) {
	      cout << s << "\n";
	      continue;
	    }
	    summa += luku;
	    n++;
	  }
	
	  fi.close();
	
	  if ( n > 0 ) ka = summa/n;
	
	  cout.precision(2); cout.setf(ios::showpoint | ios::fixed);
	  cout << "\n";
	  cout << "Lukuja oli " << n << " kappaletta\n";
	  cout << "Niiden summa oli " << summa << "\n";
	  cout << "ja keskiarvo oli " << ka << endl;
	
	  return 0;
	}

Tehtävä 17.150 Tiedoston lukujen summa

1.
Muuta tiedoston Tied_kaG.cpp - ohjelmaa siten, että väärän rivin kohdalla tulostetaan väärä rivi ja lopetetaan koko ohjelma.
2.
Muuta edelleen ohjelmaa siten, että väärät rivit tulostetaan näyttöön:
	Tiedostossa oli seuraavat laittomat rivit:
	kissa
	Lukuja oli... 
Ilmoitusta ei tietenkään tule, mikäli tiedostossa ei ole laittomia merkkejä. Tyhjää riviä ei tulkita vääräksi riviksi.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys