/* tehtävät 1 ja 2 */ /* tiedostojen käsittely funktiot ovat myös stdio.h:ssa */ #include /* henkilötieto tietueemme */ struct htieto { int ika; char etunimi[11]; char sukunimi[21]; double pituus; }; /* print_htieto tulostaa argumenttina annetun tietueen kentät * ruudulle */ void print_htieto(struct htieto tieto); /* read_htieto ei tarvitse argumentteja -- se palauttaa lukemansa * tietueen paluuarvona */ struct htieto read_htieto(); void main() { /* tehdään kaksi tietuemuuttujaa henk1 ja henk2 */ struct htieto henk1, henk2; /* outfile:ä kätetään tulostukseen, ja infile:ä lukemiseen */ FILE *outfile, *infile; /* luetaan näppikseltä ensin henk1 tiedot */ henk1 = read_htieto(); /* tulostetaan just luettu tieto ruudulle, print_htieto tekee sen */ print_htieto(henk1); /* valmistaudutaan kirjoittamaan tiedot tiedostoon. ensimmäisenä on * tietenkin avattava tiedosto. Tässä, kun kerta ollaan * kirjoittamassa, toinen argumentti fopeniin on "w", w = write. * Ensimmäinen argumenti on tietenkin avattava tiedosto */ outfile = fopen("tieto.txt", "w"); /* ok, tiedoston pitäisi olla nyt auki. Tulostetaan siihen * käyttämällä fprintf funktiota -- se on vain printf, * mutta ekaksi argumentiksi tiedosto (FILE*) johon * tulostetaan */ fprintf(outfile, "%10d\n%10s\n%20s\n%lf\n", henk1.ika, /* tässä tietenkin tulostetaan */ henk1.etunimi, /* henk1 tietueen kentät */ henk1.sukunimi, henk1.pituus); /* suljetaan tiedosto */ fclose(outfile); /* nyt, luetaan se mitä tuli kirjoitettua -- avataan sama tiedosto, * mutta nyt moodilla "r", r = read */ infile = fopen("tieto.txt", "r"); /* Luetaan tiedostoa fscanf funktiolla. */ fscanf(infile, "%10d\n%10s\n%20s\n%lf\n", &henk2.ika, henk2.etunimi, henk2.sukunimi, &henk2.pituus); /* tulostetaan tiedot print_htieto funktiolla */ print_htieto(henk2); } void print_htieto(struct htieto tieto) { printf("%10s:%4d\n%10s:%10s\n%10s:%20s\n%10s:%5.1lf\n", "ikä", tieto.ika, "etunimi", tieto.etunimi, "sukunimi", tieto.sukunimi, "pituus", tieto.pituus); } struct htieto read_htieto() { /* tässä funktiossa tarvitaan yksi paikallinen struct htieto * tietuemuuttuja, 'tieto'. Ensinnäkin siksi, koska meidän pitää * lukea käyttäjän antamat tiedot jonnekin, ja toiseksi, me * tarvitaan jotain, mitä me voidaan palauttaa returnilla */ struct htieto tieto; /* tavallinen scanffi -- luetaan ikä, etunimi, sukunimi ja * pituus. muista, että &-merkkiä ei pidä laittaa kun luetaan * merkkijonoja! */ scanf("%d%10s%20s%lf", &tieto.ika, tieto.etunimi, /* <- ei &-merkkiä !! */ tieto.sukunimi, /* <- ei &-merkkiä !! */ &tieto.pituus); /* ok, tiedot on luettu muuttujaan 'tieto'. return sanoo, että tämän * funktion tulos on 'tieto', ja että tähän tämä funktio * lopetetaan! */ return (tieto); }