17.5.1 fscanf
Olkoon meillä vaikkapa seuraavanlainen tiedosto:
tiedosto\tuotteet.dat - esimerkkitiedosto
Volvo | 12300 | 1
Audi | 55700 | 2
Saab | 1500 | 4
Volvo | 123400 | 1<EOF>
Tiedosto voitaisiin lukea ja vaikkapa tulostaa näytölle seuraavalla
ohjelmalla:
tiedosto\tuotteet.c - tuotetiedoston lukeminen
#include <stdio.h>
#include <stdlib.h>
typedef struct{
char nimike[20];
double hinta;
int kpl;
} Tuote_tyyppi;
int tulosta_tuotteet(void)
{
FILE *f; Tuote_tyyppi tuote;
f = fopen("TUOTTEET.DAT","rt");
if (!f) return 1;
printf("\n\n\n");
printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
while ( !feof(f) ) {
fscanf(f,"%s |%lf |%d",&tuote.nimike,&tuote.hinta,&tuote.kpl);
printf("%- 20s %7.0lf %4d\n",tuote.nimike,tuote.hinta,tuote.kpl);
}
printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \n");
printf("\n\n\n");
fclose(f);
return 0;
}
int main(void)
{
if (tulosta_tuotteet()) {
printf("Tuotteita ei saada luetuksi!\n");
return 1;
}
return 0;
}
Ohjelmassa on kuitenkin seuraavia huonoja puolia:
- *
- mikäli tiedoston loppu ei olekaan viimeisen rivin lopussa, tulostaa
ohjelma viimeisen rivin 2 kertaa
- *
- mikäli jokin rivi on väärää muotoa, menee ohjelma
varsin sekaisin
- Miten edellisessä ohjelmassa estettäisiin viimeisen rivin
tulostuminen kahdesti?
- Mitä edellinen ohjelma tulostaisi seuraavasta tiedostosta:
Volvo | 12300 | 1
Audi 55700 | 2
Saab | 1500 | 4
Volvo | 123400 | 1
<EOF>