previous next Up Title Contents Index

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

Tehtävä 17.154 Tiedoston lopun testaus

Miten edellisessä ohjelmassa estettäisiin viimeisen rivin tulostuminen kahdesti?

Tehtävä 17.155 Ohjelman "sekoaminen"

Mitä edellinen ohjelma tulostaisi seuraavasta tiedostosta:
	    Volvo |  12300 | 1
	    Audi     55700 | 2
	    Saab  |   1500 | 4
	    Volvo | 123400 | 1
	<EOF>


previous next Up Title Contents Index