/****************************************************************************/ /* ** O T T E L T A L . C ** ** Sarjan otteluiden tietojen levylt„ lukeminen ja levylle tallettaminen. ** ** Aliohjelmat: ** luo_ottelurekisteri - kysyy ottelurekisterin t„ydellisen nimen ja ** alustaa ja luo tarvittavat rakenteet. ** lisaa_ottelu_rivi - lis„„ uuden ottelun joka on annettu muodossa ** JypHT|KalPa|6|0| ** lue_ottelurekisteri - kysyy ottelurekisterin nimen ja lukee tiedot ** levylt„ mik„li ottelurekisteri„ ei l”ydy, ** annetaan mahdollisuus uuden luomiseen ** ottelu_riviksi - muuttaa ottelutietueen tiedot muotoon ** JypHT|KalPa|6|0| ** talleta_ottelurekisteri -tallettaa ottelurekisterin tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** o_kopioi_kommentit - kopioi toisen tiedoston kommentit toiseen ** o_mallirivi - tekee mallirivin tallettamista varten ** ** ** Aliohjelmat olettavat ottelutiedoston olevan seuraavaa muotoa: ** **Liigapelit **132 **; Kenttien j„rjestys tiedostossa on seuraava: **; kotijoukkue |vierasjoukkue |koti_maalit |vieras_maalit| **JypHT |KalPa |6 |0 | **Ilves |Tappara |4 |4 | **HIFK |TPS |3 |7 | ** ** ** ** 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: 11.12.1991/jaa ** Mit„ muutettu: Vastaamaan omaa harjoitusty”t„ ** */ #include #include #include #include "mjonot.h" #include "sarja.h" /* Globaali muuttuja TYHJA_JONO[] m„„ritelty tiedostossa sarjatal.c */ /****************************************************************************/ char /* = Talletuksessa k„ytett„v„ mallirivi. */ *o_mallirivi(void) /* = TYHJA_JONO, mik„li tilaa ei saada varattua. */ /* ** Funktiolla luodaan tilaa mallirivi„ varten ja luodaan mallirivi, ** joka on muotoa ** ;kotijoukkue |vierasjoukkue |koti_maalit |vieras_maalit| ** ** Globaalit: OKENTAT ** Algoritmi: Lis„t„„n OKENTAT 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,O_N_S(sarja_pelit->ottelurekisterin_nimi)); printf("Anna ottelurekisterin maksimiottelum„„r„>"); lue_kokluku_oletus(MAX_OTTELUITA,&(sarja_pelit->max_otteluita)); sarja_pelit->otteluita=0; sarja_pelit->mallirivi=o_mallirivi(); return luo_ottelusto(sarja_pelit,sarja_pelit->max_otteluita); } /****************************************************************************/ int /* */ lisaa_ottelu_rivi( /* 0 = lis„ys onnistui, 1 = lis„ys ep„onnistui */ Ottelurekisteri_tyyppi *sarja_pelit ,/* s,t Ottelurek johon rivi lis„t„*/ char *rivi /* s Rivi joka sis„lt„„ lis„tt„v„n tiedot */ ) /* ** Funktiolla lis„t„„n ottelurekisteriin merkkijonossa rivi oleva ottelu. ** Ottelun tiedot t„ytyy olla eroteltuina erotinmerkeill„. ** ** Globaalit: OKENTAT,OKENTTIA ** Muuttuu: *rivi ** Kutsuu: lisaa_ottelu ** 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 |KalPa |6 |0 | ** ottelu = JypHT,KalPa,6,0 ----------------------------------------------------------------------------*/ { int i,p1=0,p2=0,lr=strlen(rivi); Ottelu_tyyppi ottelu; 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„ ** otteluluetteloon. ** ** Globaalit: TARKENNIN (vakio jono) ** EROTTIMET (vakio jono) ** Sy”tt”: P„„teelt„, ** tiedostosta ** Tulostus: N„yt”lle ** Kutsuu: f_lue_jono ** O_N_S (makro) ** lue_jono ** luo_ottelusto ** lisaa_ottelu_rivi ** Tekij„: Vesa Lappalainen ** Pvm: 9.11.1991 ----------------------------------------------------------------------------*/ { FILE *f; char jono[400],apu[50], *viesti; int vikoja=0; sarja_pelit->mallirivi = TYHJA_JONO; sarja_pelit->nykyottelu = 0; sarja_pelit->max_otteluita = MAX_OTTELUITA; sarja_pelit->otteluita = 0; sarja_pelit->haku = NULL; do { /* Kysell„„n kunnes tiedosto l”ytyy! */ printf("Anna ottelurekisterin nimi>"); if ( lue_jono(O_N_S(sarja_pelit->tiedoston_nimi)) <= OLETUS ) return NIMEA_EI_ANNETTU; kopioi_jono(O_N_S(jono),sarja_pelit->tiedoston_nimi); liita_jono (O_N_S(jono),TARKENNIN); if ( !(f=fopen(jono,"rt")) ) { /* Avaus ei onnistu! Luodaanko? */ printf("Ottelurekisterin %s tietoja ei ole!\n", sarja_pelit->tiedoston_nimi); printf("Luodaanko tiedot (K/e):"); if ( kylla_vastaus() ) return luo_ottelurekisteri(sarja_pelit); } /* Avaus ei onnistu! Luodaanko? */ } while (!f); /* Kunnes tiedosto l”ytyy! */ /* Luetaan tiedostosta ottelurekisterin nimi ja max_koko sek„ luodaan ottelusto*/ if ( f_lue_jono(f,O_N_S(sarja_pelit->ottelurekisterin_nimi))max_otteluita); if ( (viesti=luo_ottelusto(sarja_pelit,sarja_pelit->max_otteluita))!=NULL ) return viesti; /* Luetaan ottelusto ja mahd. mallirivi: */ while ( !feof(f) ) { if ( f_lue_jono(f,O_N_S(jono))<=OLETUS ) continue; if ( jono[0]==';' ) { /* Jos kommenttirivi */ if ( strpbrk(jono,EROTTIMET) ) { /* Mallirivi */ if ( sarja_pelit->mallirivi != TYHJA_JONO ) free(sarja_pelit->mallirivi); sarja_pelit->mallirivi = tee_jono(jono); } continue; /* Muuten kommenttirivit unohdetaan. */ } kopioi_jono(O_N_S(apu),jono); /* Jemmataan p„tk„ rivi„ viestiksi! */ if ( lisaa_ottelu_rivi(sarja_pelit,jono) ) { printf("*** Ei saada lis„tty„: %s ***\n",apu); vikoja++; } } /* Jos tee_jono ep„onnistui, laitetaan jokin mallirivi */ if (!sarja_pelit->mallirivi) sarja_pelit->mallirivi = TYHJA_JONO; fclose(f); if (vikoja) { printf("%d ottelua j„i lis„„m„tt„!\n",vikoja); odota_jotakin(); } return NULL; } /****************************************************************************/ int /* */ ottelu_riviksi( /* 0 = onnistuu 1 = ei onnistu */ Ottelu_tyyppi *ottelu ,/* s Ottelu joka muutetaan */ char *malli ,/* s Mallirivi, josta otetaan pituudet */ char *rivi ,/* t Rivi jonne ottelu muutetaan */ int max_pit /* s Rivin maksimipituus */ ) /* ** Funktiolla muutetaan ottelu 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: OKENTAT ** 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 = "kotijoukkue |vierasjoukkue|koti_maalit|vieras_maalit" ** ottelu = JypHT,KalPa,6,0 ** rivi = JypHT |KalPa |6 |0 ----------------------------------------------------------------------------*/ { 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 (O_N_S(bak_nimi),VANHATARK); kopioi_jono(O_N_S(jono) ,sarja_pelit->tiedoston_nimi); liita_jono (O_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_pelit->ottelurekisterin_nimi)==EOF ) return EI_TALLETU; if ( fprintf(f,"%d\n",sarja_pelit->max_otteluita)==EOF ) return EI_TALLETU; if ( o_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_pelit->mallirivi)==EOF ) return EI_TALLETU; } for (i=0; iotteluita; i++) { ottelu_riviksi(sarja_pelit->ottelut[i],sarja_pelit->mallirivi,O_N_S(jono)); if ( fprintf(f,"%s\n",jono)==EOF ) return EI_TALLETU; } fclose(f); printf("\n"); printf("Otteluiden tiedot talletettu tiedostoon %s%s\n", sarja_pelit->tiedoston_nimi,TARKENNIN); if (vanhat_tallessa) printf("Otteluiden vanhat tiedot tiedostossa %s%s\n", sarja_pelit->tiedoston_nimi,VANHATARK); return NULL; }