/****************************************************************************/ /* ** K E R H O T A L . C ** ** Kerhon tietojen levylt„ lukeminen ja levylle tallettaminen. ** ** Aliohjelmat: ** luo_kerho - kysyy kerhon t„ydellisen nimen ja alustaa ** ja luo tarvittavat rakenteet. ** lisaa_jasen_rivi - lis„„ uuden j„sen joka annettu muodossa ** Ankka Aku|12234-34|... ** lue_kerho - kysyy kerhon nimen ja lukee tiedot levylt„ ** mik„li kerhoa ei l”ydy, annetaan mahdollisuus ** uuden luomiseen ** jasen_riviksi - muuttuu j„sentietueen tiedot muotoon ** Ankka Aku|12234-34|... ** talleta_kerho - tallettaa kerhon tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** ** ** Aliohjelmat olettavat tiedoston olevan seuraavaa muotoa: ** **Kelmien kerho ry **50 **; Kenttien j„rjestys tiedostossa on seuraava: **; sukunimi etunimet|sotu |katuosoite |postinumero|postiosoite|kotipuh... **Ankka Aku |010245-123U|Ankkakuja 6 |12345 |ANKKALINNA |12-1232... **Susi Sepe |020347-123T| |12555 |Per„mets„ | ... **Ponteva Veli |030455-3333| |12555 |Per„mets„ | ... ** ** ** Tiedoston alussa olevat kommenttirivit unohdetaan. ** ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 20.12.1991 ** Muutettu: ** Mit„ muutettu: ** ** */ #include #include #include #include "mjonot.h" #include "kerho.h" /****************************************************************************/ char /* NULL = onnistui */ *luo_kerho( /* muut = virheilmoitus merkkijonona */ Kerho_tyyppi *kerho /* s Luotava kerho */ ) /* ** Funktiolla tehd„„n uuden kerhon luomisessa tarvittavat toimenpiteet. ** ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: lue_jono_oletus ** lue_kokluku_oletus ** luo_jasentaulukko ----------------------------------------------------------------------------*/ { printf("\n"); lue_jono_oletus("Anna kerhon koko nimi ",0,0, kerho->tiedoston_nimi,N_S(kerho->kerhon_nimi)); printf("Anna kerhon maksimij„senm„„r„>"); lue_kokluku_oletus(MAX_JASENIA,&(kerho->max_jasenia)); kerho->jasenia=0; return luo_jasentaulukko(kerho,kerho->max_jasenia); } /****************************************************************************/ int /* */ lisaa_jasen_rivi( /* 0 = lis„ys onnistui, 1 = lis„ys ep„onnistui */ Kerho_tyyppi *kerho ,/* s,t Kerho johon rivi lis„t„„n */ char *rivi /* s Rivi joka sis„lt„„ lis„tt„v„n tiedot */ ) /* ** Funktiolla lis„t„„n j„senist””n merkkijonossa rivi oleva j„sen. ** J„senen tiedot t„ytyy olla eroteltuina erotinmerkeill„. ** ** Globaalit: KENTAT,KENTTIA ** Muuttuu: *rivi ** Kutsuu: kopioi_jono ** poista_tyhjat ** palanen ** lisaa_jasen ** Esimerkki: rivi = Ankka Aku |010245-123U|Ankkakuja 6 |12345|... ** jasen = Ankka Aku,010245-123U,Ankkakuja 6,12345... ----------------------------------------------------------------------------*/ { char st[80]; int j; /* ENSIMMAINEN ja SEURAAVA tarvitsevat! */ Jasen_tyyppi jasen; ENSIMMAINEN(jasen.nimi,rivi); SEURAAVA(jasen.sotu); SEURAAVA(jasen.katuosoite); SEURAAVA(jasen.postinumero); SEURAAVA(jasen.postiosoite); SEURAAVA(jasen.kotipuhelin); SEURAAVA(jasen.tyopuhelin); SEURAAVA(jasen.autopuhelin); SEURAAVA(st); jasen.liittymisvuosi = jono_intiksi(st,"%d"); SEURAAVA(st); jasen.jmaksu = jono_doubleksi(st,"%lf"); SEURAAVA(st); jasen.maksu = jono_doubleksi(st,"%lf"); SEURAAVA(jasen.lisatietoja); return lisaa_jasen(kerho,&jasen); } static char *TIEDOSTO_VAARIN = "Tiedosto on v„„r„„ muotoa!"; static char *NIMEA_EI_ANNETTU = "Kerhon nime„ ei annettu!"; /****************************************************************************/ char /* NULL = onnistui */ *lue_kerho( /* muut = virheilmoitus merkkijonona */ Kerho_tyyppi *kerho /* s,t Kerho johon luetaan. */ ) /* ** Funktiolla luetaan kerhon nimi. Mik„li tiedosto l”ytyy, luetaan ** tiedosto. Mik„li tiedostoa ei l”ydy ja se halutaan luoda, kysyt„„n ** kerhon lis„tietoja ja alustetaan tarpeelliset asiat. ** ** Tiedoston muoto oletetaan seuraavaksi: **Kerhon koko nimi **max_jasenia **; Kommenttirivi 1 **; Kommenttirivi ... **; Kommenttirivi n **; nimi |sotu | |... **Ankka Aku|010245-123U|Ankkakuja 6 |12345 ... **... ** ** ** Kommenttirivit unohdetaan. ** Tulostetaan ne rivit, joita ei jostakin syyst„ saada lis„tty„ ** j„senluetteloon. ** ** Globaalit: TARKENNIN (vakio jono) ** EROTTIMET (vakio jono) ** Sy”tt”: P„„teelt„, ** tiedostosta ** Tulostus: N„yt”lle ** Kutsuu: f_lue_jono ** N_S (makro) ** lue_jono ** luo_jasentaulukko ** lisaa_jasen_rivi ----------------------------------------------------------------------------*/ { #define PALAUTA(sanoma) {paluu_viesti = sanoma; goto sulje;} FILE *f; char jono[400],apu[50], *viesti, *paluu_viesti = NULL; int vikoja=0; kerho->nykyjasen = 0; kerho->max_jasenia = MAX_JASENIA; kerho->jasenia = 0; do { /* Kysell„„n kunnes tiedosto l”ytyy! */ printf("Anna kerhon nimi>"); if ( lue_jono(N_S(kerho->tiedoston_nimi)) <= OLETUS ) return NIMEA_EI_ANNETTU; kopioi_jono(N_S(jono),kerho->tiedoston_nimi); liita_jono (N_S(jono),TARKENNIN); if ( !(f=fopen(jono,"rt")) ) { /* Avaus ei onnistu! Luodaanko? */ printf("Kerhon %s tietoja ei ole!\n",kerho->tiedoston_nimi); printf("Luodaanko tiedot (K/e):"); if ( kylla_vastaus() ) return luo_kerho(kerho); } /* Avaus ei onnistu! Luodaanko? */ } while (!f); /* Kunnes tiedosto l”ytyy! */ /* Luetaan tiedostosta kerhon nimi ja max_koko sek„ luodaan j„senist” */ if ( f_lue_jono(f,N_S(kerho->kerhon_nimi))max_jasenia); if ( (viesti=luo_jasentaulukko(kerho,kerho->max_jasenia))!=NULL ) PALAUTA(viesti); /* Luetaan j„senist”: */ while ( !feof(f) ) { if ( f_lue_jono(f,N_S(jono))<=OLETUS ) continue; if ( jono[0]==';' ) continue; /* Jos kommenttirivi */ kopioi_jono(N_S(apu),jono); /* Jemmataan p„tk„ rivi„ viestiksi! */ if ( lisaa_jasen_rivi(kerho,jono) ) { printf("*** Ei saada lis„tty„: %s ***\n",apu); vikoja++; } } sulje: fclose(f); if (vikoja) { printf("%d nime„ j„i lis„„m„tt„!\n",vikoja); odota_jotakin(); } return paluu_viesti; #undef PALAUTA } /****************************************************************************/ int /* */ jasen_riviksi( /* 0 = onnistuu 1 = ei onnistu */ Jasen_tyyppi *jasen ,/* s J„sen joka muutetaan */ char *rivi ,/* t Rivi jonne j„sen muutetaan */ int max_pit /* s Rivin maksimipituus */ ) /* ** Funktiolla muutetaan j„sen yhdeksi riviksi, jossa kent„t on erotettu ** toisistaan erotinmerkill„. ** ** Esimerkki: ** jasen = Ankka Aku,010245-123U,Ankkakuja 6,12345... ** rivi ="Ankka Aku|010245-123U|Ankkakuja 6|12345..." ----------------------------------------------------------------------------*/ { #define LIITA_RIVIIN(jono) { liita_jono(rivi,max_pit,jono); \ liita_jono(rivi,max_pit,"|"); } char st[80]; rivi[0] = 0; /* Tyhjennet„„n tulosjono. */ LIITA_RIVIIN(jasen->nimi); LIITA_RIVIIN(jasen->sotu); LIITA_RIVIIN(jasen->katuosoite); LIITA_RIVIIN(jasen->postinumero); LIITA_RIVIIN(jasen->postiosoite); LIITA_RIVIIN(jasen->kotipuhelin); LIITA_RIVIIN(jasen->tyopuhelin); LIITA_RIVIIN(jasen->autopuhelin); int_jonoksi(N_S(st),jasen->liittymisvuosi,"%d"); LIITA_RIVIIN(st); double_jonoksi(N_S(st),jasen->jmaksu,"%4.2lf"); LIITA_RIVIIN(st); double_jonoksi(N_S(st),jasen->maksu,"%4.2lf"); LIITA_RIVIIN(st); LIITA_RIVIIN(jasen->lisatietoja); return 0; #undef LIITA_RIVIIN } static char *EI_TALLETU = "Kerhon talletus ei onnistu!"; static char *EI_AUKEA_K = "Tiedostoa ei voi avata kirjoittamista varten!"; /****************************************************************************/ char /* NULL = onnistui */ *talleta_kerho( /* muut = virheilmoitus merkkijonona */ Kerho_tyyppi *kerho /* s Talletetava kerho */ ) /* ** Funktiolla talletetaan kerho. Vanha tiedosto nimet„„n ensin ** nimi.VANHATARK. ** ** Globaalit: VANHATARK ** TARKENNIN ** Tulostus: Tiedostoon ** Kutsuu: kopioi_jono ** liita_jono ** jasen_riviksi ----------------------------------------------------------------------------*/ { #define PALAUTA(sanoma) {paluu = sanoma; goto sulje;} FILE *f; char jono[400],bak_nimi[20],*paluu=NULL; int vanhat_tallessa,i; logo(); kopioi_jono(N_S(bak_nimi),kerho->tiedoston_nimi); liita_jono (N_S(bak_nimi),VANHATARK); kopioi_jono(N_S(jono) ,kerho->tiedoston_nimi); liita_jono (N_S(jono) ,TARKENNIN); remove(bak_nimi); /* Vanha .BAK t„ytyy poistaa jotta rename toimii */ vanhat_tallessa = !rename(jono,bak_nimi); if ( !(f = fopen(jono,"wt") ) ) return EI_AUKEA_K; if ( fprintf(f,"%s\n",kerho->kerhon_nimi)==EOF ) PALAUTA(EI_TALLETU); if ( fprintf(f,"%d\n",kerho->max_jasenia)==EOF ) PALAUTA(EI_TALLETU); for (i=0; ijasenia; i++) { jasen_riviksi(kerho->jasenet[i],N_S(jono)); if ( fprintf(f,"%s\n",jono)==EOF ) PALAUTA(EI_TALLETU); } sulje: fclose(f); printf("\n"); printf("Tiedot talletettu tiedostoon %s%s\n",kerho->tiedoston_nimi,TARKENNIN); if (vanhat_tallessa) printf("Vanhat tiedot tiedostossa %s%s\n",kerho->tiedoston_nimi,VANHATARK); return paluu; #undef PALAUTA }