Primjer rada s datotekama za reorganiziranje
robe
Slijedeći program koristi ASCII tekst file koji
opisuje broj proizvoda, i učitava svaki proizvod u strukturu programa
/* obradi datoteku i ispiši svu */ /* robu čija količina na "dlanu" */ /* je manja ili jednaka unaprijed */ /* određenom nivou */ #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> /* definicija strukture tipa robe */ struct goods { char name[20]; /* ime proizvoda */ float price; /* cijena proizvoda */ int quantity; /* količina na "dlanu" */ int reorder; /* unaprijed određeni nivo */ }; /* funkcijski prototipovi */ void myexit( int ); void processfile( void ); void printrecord( struct goods ); int getrecord( struct goods * ); /* globalne variable */ FILE *fopen(), *input_file; /* input file pokazivač */ /* osigurava "dostojanstven" izlaz iz programa */ void myexit( int exitcode ) { if( input_file != NULL ) fclose( input_file ); exit( exitcode ); } /* ispis robe */ void printrecord( struct goods record ) { printf("\nIme proizvoda\t%s\n", record.name ); printf("Cijena proizvoda\t%.2f\n", record.price ); printf("Količina proizvoda\t%d\n", record.quantity ); printf("Određeni nivo proizvoda\t%d\n", record.reorder ); } /* čita jedan proizvod iz inputfile u 'record',vrača 1 ako je uspješno*/ int getrecord( struct goods *record ) { int loop = 0, ch; char buffer[40]; ch = fgetc( input_file ); /* preskoči na početak recorda */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* čita ime proizvoda*/ while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; strcpy( record->name, buffer ); if( ch == EOF ) return 0; /* preskoči na početak slijedećeg polja */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* pročitaj cijenu proizvoda */ loop = 0; while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; record->price = atof( buffer ); if( ch == EOF ) return 0; /* preskoči na početak slijedećeg polja */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* pročitaj količinu proizvoda */ loop = 0; while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; record->quantity = atoi( buffer ); if( ch == EOF ) return 0; /* preskoči na početak slijedećeg polja */ while( (ch == '\n') || (ch == ' ') && (ch != EOF) ) ch = fgetc( input_file ); if( ch == EOF ) return 0; /* pročitaj odreeni nivo proizvoda */ loop = 0; while( (ch != '\n') && (ch != EOF)) { buffer[loop++] = ch; ch = fgetc( input_file ); } buffer[loop] = 0; record->reorder = atoi( buffer ); if( ch == EOF ) return 0; return 1; /* označava da je uspješno pročitano */ } /* obrada datoteke*/ void processfile( void ) { struct goods record; /* record učitan iz inputfile */ while( ! feof( input_file )) { if( getrecord( &record ) == 1 ) { if( record.quantity <= record.reorder ) printrecord( record ); } else myexit( 1 ); /* pogreška */ } } main() { char filename[40]; /* ime datoteke podataka */ printf("Primjer programa reorganiziranja robe\n"); printf("Unesi ime datoteke"); scanf(" %s", filename ); input_file = fopen( filename, "rt" ); if( input_file == NULL ) { printf("Nije moguće otvoriti datoteku %s\n", filename ); myexit( 1 ); } processfile(); myexit( 0 ); }
Datoteka (standard ASCII tekst file) koja se koristi u ovom primjeru izgleda kao
zapečeni grah 1.20 10 5 kafa 2.76 5 10 sladoled 3.47 5 5 smoki 4.58 12 10