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