/****************************************************************************/ /* ** S A R J A T A L . C ** ** Sarjan joukkueiden tietojen levylt„ lukeminen ja levylle tallettaminen. ** ** Aliohjelmat: ** luo_sarja - kysyy sarjan t„ydellisen nimen ja alustaa ** ja luo tarvittavat rakenteet. ** lisaa_joukkue_rivi - lis„„ uuden joukkueen joka on annettu muodossa ** JypHT|Jyv„skyl„|... ** lue_sarja - kysyy sarjan nimen ja lukee tiedot levylt„ ** mik„li sarjaa ei l”ydy, annetaan mahdollisuus ** uuden luomiseen ** joukkue_riviksi - muuttaa joukkuetietueen tiedot muotoon ** JypHT|Jyv„skyl„|... ** talleta_sarja - tallettaa sarjan tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** j_kopioi_kommentit - kopioi toisen tiedoston kommentit toiseen ** j_mallirivi - tekee mallirivin tallettamista varten ** ** ** Aliohjelmat olettavat joukkuetiedoston olevan seuraavaa muotoa: ** **SM_liiga **12 **; Kenttien j„rjestys tiedostossa on seuraava: **; nimi |kotipaikka |pisteet |tehdyt_maalit|paastetyt_maalit|tunnus| **Jyp Hokey Team |Jyv„skyl„ |25 |52 |25 |JypHT | **Tampereen Ilves |Tampere |34 |42 |24 |Ilves | **Turun palloseura |Turku |30 |70 |23 |TPS | ** ** ** ** Tiedostojen alussa olevat kommenttirivit kirjoitetaan talletuksessa ** per„kk„in nimi ja koko -rivin j„lkeen. ** Se kommenttirivi, jolla on erotinmerkki, toimii talletuksen ** yhteydess„ mallirivin„, joka m„„r„„ sarakkeiden leveydet. ** ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 13.11.1991 ** Muutettu: 05.12.1991/jaa ** Mit„ muutettu: Vastaamaan omaa harjoitusty”t„ ** */ #include #include #include #include "mjonot.h" #include "sarja.h" char TYHJA_JONO[1] = ""; /****************************************************************************/ char /* = Talletuksessa k„ytett„v„ mallirivi. */ *j_mallirivi(void) /* = TYHJA_JONO, mik„li tilaa ei saada varattua. */ /* ** Funktiolla luodaan tilaa mallirivi„ varten ja luodaan mallirivi, ** joka on muotoa ** ;nimi |kotipaikka |pisteet |.... ** ** Globaalit: JKENTAT ** Algoritmi: Lis„t„„n JKENTAT taulukosta aina seuraava kent„n nimi ** ja laitetaan | kent„n mallipituuden p„„h„n. ----------------------------------------------------------------------------*/ { int koko=0,k; char *m; for (k=0; ktiedoston_nimi,J_N_S(sarja->sarjan_nimi)); printf("Anna sarjan maksimijoukkuem„„r„>"); lue_kokluku_oletus(MAX_JOUKKUEITA,&(sarja->max_joukkueita)); sarja->joukkueita=0; sarja->mallirivi=j_mallirivi(); return luo_joukkueisto(sarja,sarja->max_joukkueita); } /****************************************************************************/ int /* */ lisaa_joukkue_rivi( /* 0 = lis„ys onnistui, 1 = lis„ys ep„onnistui */ Sarja_tyyppi *sarja ,/* s,t Sarja johon rivi lis„t„„n */ char *rivi /* s Rivi joka sis„lt„„ lis„tt„v„n tiedot */ ) /* ** Funktiolla lis„t„„n joukkueistoon merkkijonossa rivi oleva joukkue. ** Joukkueen tiedot t„ytyy olla eroteltuina erotinmerkeill„. ** ** Globaalit: JKENTAT,JKENTTIA ** Muuttuu: *rivi ** Kutsuu: lisaa_joukkue ** Tekij„: Vesa Lappalainen ** Pvm: 9.11.1991 ** Algoritmi: Luetaan kuhunkin kentt„„n tieto kentt„listan mukaan. ** rivist„ etsit„„n erotinmerkki ja laitetaan sen tilalle ** NUL-merkki. Poistetaan turhat tyhj„t. ** L”ytynyt jono laitetaan oikeaan kentt„„n. ** Riviss„ siirryt„„n erotinmerkki„ seuraavaan paikkaan. ** (strtok ei k„y, koska se hukkaa per„kk„iset erotinmerkit ** joista pit„isi tulla tyhji„ kentti„!) ** Esimerkki: rivi = JypHT |Jyv„skyl„|25 |52 |25 | ** joukkue = JypHT,Jyv„skyl„,25,52,25 ----------------------------------------------------------------------------*/ { int i,p1=0,p2=0,lr=strlen(rivi); Joukkue_tyyppi joukkue; for (i=0; i ** ** Se kommenttirivi (tai viimeinen niist„), joilla esiintyy ** erotinmerkki (esim. |) otetaan tallettamista varten malliriviksi. ** Muuten kommenttirivit unohdetaan. ** Tulostetaan ne rivit, joita ei jostakin syyst„ saada lis„tty„ ** joukkueluetteloon. ** ** Globaalit: TARKENNIN (vakio jono) ** EROTTIMET (vakio jono) ** Sy”tt”: P„„teelt„, ** tiedostosta ** Tulostus: N„yt”lle ** Kutsuu: f_lue_jono ** J_N_S (makro) ** lue_jono ** luo_joukkueisto ** lisaa_joukkue_rivi ** Tekij„: Vesa Lappalainen ** Pvm: 9.11.1991 ----------------------------------------------------------------------------*/ { FILE *f; char jono[400],apu[50], *viesti; int vikoja=0; sarja->mallirivi = TYHJA_JONO; sarja->nykyjoukkue = 0; sarja->max_joukkueita = MAX_JOUKKUEITA; sarja->joukkueita = 0; sarja->haku = NULL; do { /* Kysell„„n kunnes tiedosto l”ytyy! */ printf("Anna sarjan nimi>"); if ( lue_jono(J_N_S(sarja->tiedoston_nimi)) <= OLETUS ) return NIMEA_EI_ANNETTU; kopioi_jono(J_N_S(jono),sarja->tiedoston_nimi); liita_jono (J_N_S(jono),TARKENNIN); if ( !(f=fopen(jono,"rt")) ) { /* Avaus ei onnistu! Luodaanko? */ printf("Sarjan %s tietoja ei ole!\n",sarja->tiedoston_nimi); printf("Luodaanko tiedot (K/e):"); if ( kylla_vastaus() ) return luo_sarja(sarja); } /* Avaus ei onnistu! Luodaanko? */ } while (!f); /* Kunnes tiedosto l”ytyy! */ /* Luetaan tiedostosta sarjan nimi ja max_koko sek„ luodaan joukkueisto */ if ( f_lue_jono(f,J_N_S(sarja->sarjan_nimi))max_joukkueita); if ( (viesti=luo_joukkueisto(sarja,sarja->max_joukkueita))!=NULL ) return viesti; /* Luetaan joukkueisto ja mahd. mallirivi: */ while ( !feof(f) ) { if ( f_lue_jono(f,J_N_S(jono))<=OLETUS ) continue; if ( jono[0]==';' ) { /* Jos kommenttirivi */ if ( strpbrk(jono,EROTTIMET) ) { /* Mallirivi */ if ( sarja->mallirivi != TYHJA_JONO ) free(sarja->mallirivi); sarja->mallirivi = tee_jono(jono); } continue; /* Muuten kommenttirivit unohdetaan. */ } kopioi_jono(J_N_S(apu),jono); /* Jemmataan p„tk„ rivi„ viestiksi! */ if ( lisaa_joukkue_rivi(sarja,jono) ) { printf("*** Ei saada lis„tty„: %s ***\n",apu); vikoja++; } } /* Jos tee_jono ep„onnistui, laitetaan jokin mallirivi */ if (!sarja->mallirivi) sarja->mallirivi = TYHJA_JONO; fclose(f); if (vikoja) { printf("%d nime„ j„i lis„„m„tt„!\n",vikoja); odota_jotakin(); } return NULL; } /****************************************************************************/ int /* */ joukkue_riviksi( /* 0 = onnistuu 1 = ei onnistu */ Joukkue_tyyppi *joukkue ,/* s Joukkue joka muutetaan */ char *malli ,/* s Mallirivi, josta otetaan pituudet */ char *rivi ,/* t Rivi jonne joukkue muutetaan */ int max_pit /* s Rivin maksimipituus */ ) /* ** Funktiolla muutetaan joukkue yhdeksi riviksi, jossa kent„t on erotettu ** toisistaan mallirivist„ l”ytyvill„ erotinmerkeill„. Mik„li malliriviss„ ** on v„hemm„n tilaa, kuin tarvitaan, k„ytet„„n tarvittava m„„r„ tilaa. ** Mik„li mallirivi on tyhj„, pakataan tiedot niin ahtaalle kuin mahdollista. ** ** Globaalit: JKENTAT ** EROTTIMET ** Algoritmi: Mallirivist„ etsit„„n erotinmerkkej„. Aina kun erotinmerkki ** l”ytyy, laitetaan tulosriviin kentt„listan mukaisesti seuraava ** kentt„ ja riitt„v„sti tyhji„, jotta erotin merkki saadaan ** samalle paikalle. Sitten laitetaan erotinmerkki. Mik„li ** mallirivin erotinmerkit loppuu ennen kentt„listaa, k„ytet„„n ** edellist„ erotinmerkki„ jotta koko kentt„lista saadaan ** muutetuksi. ** Esimerkki: malli = "nimi |kotipaikka |pisteet | ..." ** joukkue = JypHT,Jyv„skyl„,25,52... ** rivi = JypHT |Jyv„skyl„ |25 |52 ----------------------------------------------------------------------------*/ { char erotin; int mi=0,ri=0; /* Indeksi mallissa ja riviss„ */ int lm=strlen(malli); int i; rivi[0] = 0; /* Tyhjennet„„n tulosjono. */ erotin = EROTTIMET[0]; for (i=0; i= max_pit-1 ) return 1; /* Jos rivist„ tuli liian pitk„ -> */ for (;(ritiedoston_nimi); liita_jono (J_N_S(bak_nimi),VANHATARK); kopioi_jono(J_N_S(jono) ,sarja->tiedoston_nimi); liita_jono (J_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",sarja->sarjan_nimi)==EOF ) return EI_TALLETU; if ( fprintf(f,"%d\n",sarja->max_joukkueita)==EOF ) return EI_TALLETU; if ( j_kopioi_kommentit(f,bak_nimi) ) { /* Jos ei kopioidu, laitetaan olet. */ if ( fprintf(f,"; Kenttien j„rjestys tiedostossa on seuraava:\n")==EOF ) return EI_TALLETU; if ( fprintf(f,"%s\n",sarja->mallirivi)==EOF ) return EI_TALLETU; } for (i=0; ijoukkueita; i++) { joukkue_riviksi(sarja->joukkueet[i],sarja->mallirivi,J_N_S(jono)); if ( fprintf(f,"%s\n",jono)==EOF ) return EI_TALLETU; } fclose(f); printf("\n"); printf("Joukkueiden tiedot talletettu tiedostoon %s%s\n", sarja->tiedoston_nimi,TARKENNIN); if (vanhat_tallessa) printf("Joukkueiden vanhat tiedot tiedostossa %s%s\n", sarja->tiedoston_nimi,VANHATARK); return NULL; }