Programiranje u C-u

  

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

©Copyright B Brown. 1984-1998. All rights reserved.