/* Napisati program koji ce iz slijedne formatirane ulazne datoteke * procitati pocetne (inicijalne podatke) pripremljene nekim ASCII * uredivacem texta. Ulaznih zapisa treba biti barem 10. Na osnovi ulaznih * podataka formirati direktnu neformatiranu datoteku. Slijedna datoteka s * ulaznim podacima mora nositi ime koje odgovara prezimenu, a direktna * imenu. Program mora osigurati izracunavanje prosjeka mjerene velicine u * odredenom vremenskom intervalu, te mogucnost ispisa sadrzaja zeljenog * zapisa u direktnoj datoteci. Pracenje vlaznosti zraka. */ #include #include /* Sama struktura */ struct mjerenje { unsigned sat; float vlaga; }; int main(void) { FILE *ulazna, *izlazna; struct mjerenje zapis; unsigned a = 0, b = 0, brojac_elem = 0; long velicina; float suma; /* Izracun velicine zapisa */ velicina = sizeof(struct mjerenje); /* Otvori datoteku SAMO za pisanje */ if ((izlazna = fopen("Mia", "wb")) == NULL) { fprintf(stderr, "Ne mogu otvoriti datoteku `Mia' za pisanje\n"); exit(EXIT_FAILURE); } /* Otvori datoteku SAMO za citanje */ if ((ulazna = fopen("Carapina", "r")) == NULL) { fprintf(stderr, "Ne mogu otvoriti datoteku `Carapina' za citanje\n"); exit(EXIT_FAILURE); } /* Prepisi tekstualnu u binarnu */ while (fscanf(ulazna, "%d %f", &zapis.sat, &zapis.vlaga) != EOF) { fwrite(&zapis, velicina, 1, izlazna); ++brojac_elem; } printf("Prepisao %d elemenata u binarnu datoteku\n", brojac_elem); /* Zatvori obje datoteke */ fclose(ulazna); fclose(izlazna); /* Unesi interval */ printf("Unesi interval za proracun srednje vrijednosti\n" "(pocetna_vrijednost krajnja_vrijednost): "); scanf("%u %u", &a, &b); /* Ok, sad otvori ponovno binarnu ali za citanje (kao ulaznu!) */ if ((ulazna = fopen("Mia", "rb")) == NULL) { fprintf(stderr, "Ne mogu otvoriti datoteku `Carapina' za citanje\n"); exit(EXIT_FAILURE); } /* Nase testne datoteke (posebice sada binarna) sadrze satove od 00-24 u * sebi, pa mozemo koristiti fseek() za binarnu umjesto pretrazivanja * >:) */ if (fseek(ulazna, (a - 1) * velicina, SEEK_SET) == -1) { fprintf(stderr, "Ne mogu skociti na trazeno mjesto u datoteci\n"); exit(EXIT_FAILURE); } /* Izracunaj AVG */ brojac_elem = 0; while(fread(&zapis, velicina, 1, ulazna) == 1) { if (zapis.sat == b) break; suma += zapis.vlaga; ++brojac_elem; } printf("Srednja vrijednost za interval %u-%u i %u elemenata je %f\n", a, b, brojac_elem, suma/(float)brojac_elem); /* Skoci na zeljeni zapis */ printf("Odabir zeljenog zapisa - izlazak sa `EOF'\n"); while (printf("Unesi na koji zapis zelite skociti: ") && scanf("%d", &a) != EOF) { if (fseek(ulazna, (a - 1) * velicina, SEEK_SET) == -1) { fprintf(stderr, "Ne mogu skociti na trazeno mjesto u datoteci\n"); exit(EXIT_FAILURE); } fread(&zapis, velicina, 1, ulazna); printf("Za zapis %d vrijedi: vrijeme %d, vlaga %f\n", a, zapis.sat, zapis.vlaga); } /* Zatvori i izadji */ fclose(ulazna); return EXIT_SUCCESS; }