17.7 Tiedoston yhdellä rivillä monta kenttää, lukeminen C++:lla
Toteutetaan tuot_pal.c:tä vastaava ohjelma C++:n tietovirroilla:
tiedosto\tuot_pal.cpp - esimerkki tiedoston lukemisesta
// Projektiin +ALI\mjonot.c
#include <iostream.h>
#include <fstream.h>
#include <strstrea.h>
#include <stdio.h>
#include <string>
using namespace std;
#include "mjonotpp.h"
struct tTuote {
string nimike;
double hinta;
int kpl;
};
void alusta(tTuote &tuote)
{
tuote.nimike = "";
tuote.hinta = 0.0;
tuote.kpl = 0;
}
int lue(istream &is,tTuote &tuote) {
char jono[50];
alusta(tuote);
is.getline(N_S(jono),'|'); tuote.nimike = poista_tyhjat(jono);
is.getline(N_S(jono),'|');
if ( sscanf(jono,"%lf",&tuote.hinta) < 1 ) return 1;
is.getline(N_S(jono),'\n');
if ( sscanf(jono,"%d",&tuote.kpl) < 1 ) return 1;
return 0;
}
int rivi_tuotteeksi(char *rivi, tTuote &tuote)
{
istrstream sstr(rivi);
return lue(sstr,tuote);
}
int tulosta_tuotteet(void)
{
tTuote tuote;
char rivi[80];
ifstream fi("TUOTTEET.DAT");
if ( !fi ) return 1;
cout << "\n\n\n";
cout << "-------------------------------------------\n";
while ( 1 ) {
if ( !fi.getline(rivi,sizeof(rivi))) break;
if ( rivi_tuotteeksi(rivi,tuote) ) continue;
printf("%-20s %7.0lf %4d\n",tuote.nimike.c_str(),tuote.hinta,tuote.kpl);
}
cout << "-------------------------------------------\n";
cout << "\n\n\n";
return 0;
}
int main(void)
{
if ( tulosta_tuotteet() ) {
cout << "Tuotteita ei saada luetuksi!\n";
return 1;
}
return 0;
}