#include #include /* Primjer za istovremeno citanje i pisanje. Dodavanje bonusa na racun. */ /* Broj racuna u polju i datoteci. */ #define BROJ_LJUDI 6 /* Tip i velicina strukture Racun. */ typedef struct { int tel_broj; char vlasnik[20]; double stanje; } Racun; int size = sizeof(Racun); /* Polje racuna za kreiranje pocetne datoteke. */ Racun korisnik[BROJ_LJUDI] = { /* xxxxxx, "0123456789012345678", xxxxx.xx */ 384907, "Tihana Glasnovic", 92.00, 622744, "Goga Trubic", 456.27, 918235, "Josip Mobitelic", -234.49, 436702, "Martina Lajavic", 74.12, 739417, "Pero Bacilova", -1017.12, 208143, "Mirna Sutljivic", 48.50, }; /* Funkcija za kreiranje pocetne datoteke racuna. */ void kreiraj(const char *f_name) { FILE *racuni; if ((racuni = fopen(f_name, "wb")) == NULL) { fprintf(stderr, "Ne mogu pisati u: %s!\n", f_name); exit(10); } /* Pisanje cijelog polja korisnik u datoteku. */ if (fwrite(korisnik, size, BROJ_LJUDI, racuni) != BROJ_LJUDI) { fprintf(stderr, "Greska u pisanju.\n"); exit(11); } fclose(racuni); return; } /* Funkcija za ispis trenutne datoteke racuna. */ void ispisi(const char *f_name) { FILE *racuni; Racun kor; int broj = 0; if ((racuni = fopen(f_name, "rb")) == NULL) { fprintf(stderr, "Ne mogu citati iz: %s!\n", f_name); exit(20); } printf("\n Sadrzaj datoteke %s:\n", f_name); /* Petlja za citanje i ispis svih racuna u datoteci. */ while (fread(&kor, size, 1, racuni) == 1) { ++broj; printf(" zapis %2d: %6d, %20s, %8.2f\n", broj, kor.tel_broj, kor.vlasnik, kor.stanje); } if (ferror(racuni)) { fprintf(stderr, "Greska u citanju.\n"); exit(21); } fclose(racuni); return; } /* Funkcija za dodavanje bonusa n-tom racunu u datoteci. */ void dodaj_bonus(const char *f_name, int n) { FILE *racuni; Racun kor; long file_pos; const double bonus = 100.0; if ((racuni = fopen(f_name, "r+b")) == NULL) { fprintf(stderr, "Ne mogu otvoriti: %s!\n", f_name); exit(1); } /* Pozicioniranje ispred n-tog zapisa. */ file_pos = (long) (n - 1) * size; if (fseek(racuni, file_pos, SEEK_SET)) { fprintf(stderr, "Greska u fseek, n = %d.\n", n); printf("Greska u fseek, n = %d.\n", n); fclose(racuni); return; /* Necu exit, za demo! */ } /* Ucitaj zapis u strukturu. */ if (fread(&kor, size, 1, racuni) != 1) if (ferror(racuni)) { fprintf(stderr, "Greska u citanju.\n"); exit(2); } else if (feof(racuni)) { fprintf(stderr, "Kraj datoteke, n = %d.\n", n); printf("Kraj datoteke, n = %d.\n", n); fclose(racuni); return; /* Necu exit, za demo! */ } /* Azuziraj stanje i napisi novi zapis. */ if (kor.stanje > 0) { kor.stanje = kor.stanje + bonus; fseek(racuni, -size, SEEK_CUR); if (fwrite(&kor, size, 1, racuni) != 1) { fprintf(stderr, "Greska u pisanju.\n"); exit(3); } } fclose(racuni); return; } /* Glavni program. */ int main(int argc, char *argv[]) { if (argc != 2) { /* Nema imena datoteke! */ fprintf(stderr, "Uporaba: %s ime_dat\n", argv[0]); exit(100); } /* Kreiranje i ispis pocetne datoteke racuna. */ kreiraj(argv[1]); ispisi(argv[1]); printf("\n Dodavanje bonusa u %s.\n", argv[1]); /* Dodaj bonus = 100.0 na stanje n-tog zapisa, ako je stanje bilo pozitivno. */ dodaj_bonus(argv[1], 3); dodaj_bonus(argv[1], 8); /* Ne postoji! */ dodaj_bonus(argv[1], 7); /* Ne postoji! */ dodaj_bonus(argv[1], 6); dodaj_bonus(argv[1], 1); /* Ispis azurirane datoteke racuna. */ ispisi(argv[1]); return 0; }