/***************************************************************************/ /* ** T U O T E T A L . C ** ** ** Tuoterekisterin tietojen levylt„ lukeminen ja levylle tallettaminen. ** ** Aliohjelmat: ** luo_rekisteri - kysyy ruokatavaraliikkeen t„ydellisen nimen ja ** alustaa ja luo tarvittavat rakenteet ** lisaa_tuote_rivi - lis„„ uuden tuotteen, joka on annettu muodossa ** 110001|A-piim„ 1l|... ** lue_rekisteri - kysyy liikkeen nimen ja lukee tiedot levylt„ ** mik„li liikett„ vastaavaa tuoterekisteri„ ei ** l”ydy, annetaan mahdollisuus uuden luomiseen ** tuote_riviksi - muuttaa tuotetietueen tiedot muotoon ** 110001|A-piim„ 1l|... ** talleta_rekisteri - tallettaa tuoterekisterin tiedot levylle ** ja muuttaa vanhan tiedoston nimelle .BAK ** ** ** Aliohjelmat olettavat tiedoston olevan seuraavaa muotoa: ** **Ruokatori **50 **; Kenttien j„rjestys tiedostossa on seuraava: **;tuotenumero|nimi |s„ilyvyysaika (pv)|t„ydennysraja|... **110001 |A-piim„ 1l |3 |10 |... **110002 |Prima sarvimakaroni 400g |90 |30 |... **110003 |Mokka Katriina 500g |120 |60 |... ** ** ** Tiedoston alussa olevat kommenttirivit unohdetaan. ** ** ** Tekij„: Iiris Suutarinen 9.4.1992 ** */ #include #include #include #include "mjonot.h" #include "tuote.h" /***************************************************************************/ char /* NULL = onnistui */ *luo_rekisteri( /* muut = virheilmoitus merkkijonona */ Rekisteri_tyyppi *rekisteri /* s Luotava tuoterekisteri. */ ) /* ** Funktiolla tehd„„n uuden rekisterin luomisessa tarvittavat toimenpiteet. ** ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: lue_jono_oletus, lue_kokluku_oletus, luo_tuotetaulukko, N_S ---------------------------------------------------------------------------*/ { printf("\n"); lue_jono_oletus(" Anna liikkeen koko nimi ",0,0, rekisteri->tiedoston_nimi,N_S(rekisteri->liikkeen_nimi)); printf(" Anna rekisterin maksimituotem„„r„>"); lue_kokluku_oletus(MAX_TUOTTEITA,&(rekisteri->max_tuotteita)); rekisteri->tuotteita = 0; return luo_tuotetaulukko(rekisteri,rekisteri->max_tuotteita); } /***************************************************************************/ int /* */ lisaa_tuote_rivi( /* 0 = lis„ys onnistui, 1 = lis„ys ep„onn. */ Rekisteri_tyyppi *rekisteri, /* s,t Rekisteri, johon rivi lis„t„„n. */ char *rivi /* s Rivi, joka sis„lt„„ lis„tt„v„n tiedot*/ ) /* ** Funktiolla lis„t„„n rekisteriin merkkijonossa rivi oleva tuote. ** Tuotteen tiedot t„ytyy olla eroteltuina erotinmerkeill„. ** ** Globaalit: KENTAT,KENTTIA ** Muuttuu: *rivi ** Kutsuu: kopioi_jono, poista_tyhjat, palanen, lisaa_tuote ** ** Esimerkki: rivi = 110001|A-piim„ 1l |3 |10 |8 |3.15... ** tuote = 110001,A-piim„ 1l,3,10,8,3.15,... ---------------------------------------------------------------------------*/ { char st[80]; int j; /* ENSIMMAINEN ja SEURAAVA tarvitsevat! */ Tuote_tyyppi tuote; Tuote_era_tyyppi era; ENSIMMAINEN(tuote.tuotenumero,rivi); SEURAAVA(tuote.nimi); SEURAAVA(st); tuote.sailyvyysaika = jono_intiksi(st,"%d"); SEURAAVA(st); tuote.taydennysraja = jono_intiksi(st,"%d"); SEURAAVA(st); tuote.keskim_myynti = jono_intiksi(st,"%d"); SEURAAVA(st); tuote.yksikkohinta = jono_doubleksi(st,"%lf"); tuote.tuote_erat = NULL; tuote.viimeinen_era = NULL; /* luetaan kaikki rivill„ olevat tuote-er„t ennen viimeist„ erotinmerkki„ */ while (j > 1) { SEURAAVA(st); era.maara = jono_intiksi(st,"%d"); SEURAAVA(st); era.pvm = jono_pvmksi(st); if (lisaa_tuote_era(&era,&tuote)) goto virhe; } return lisaa_tuote(rekisteri,&tuote); virhe: printf(" Kaikkia tuote-eri„ ei saada lis„tty„!\n"); return 1; } static char *TIEDOSTO_VAARIN = " Tiedosto on v„„r„„ muotoa!"; static char *NIMEA_EI_ANNETTU = " Liikkeen nime„ ei annettu!"; /***************************************************************************/ char /* NULL = onnistui */ *lue_rekisteri( /* muut = virheilmoitus merkkijonona */ Rekisteri_tyyppi *rekisteri /* s,t Rekisteri, johon luetaan. */ ) /* ** Funktiolla luetaan liikkeen nimi. Mik„li tiedosto (rekisteri) l”ytyy, ** luetaan tiedosto. Mik„li tiedostoa ei l”ydy ja se halutaan luoda, ** kysyt„„n rekisterin lis„tietoja ja alustetaan tarpeelliset asiat. ** ** Tiedoston muoto oletetaan seuraavaksi: **Liikkeen koko nimi **max_tuotteita **; Kommenttirivi 1 **; Kommenttirivi ... **; Kommenttirivi n **;tuotenumero|nimi |s„ilyvyysaika (pv)|t„ydennysraja|... **110001 |A-piim„ 1l |3 |10 |... **... ** ** ** Kommenttirivit unohdetaan. ** Tulostetaan ne rivit, joita ei jostakin syyst„ saada lis„tty„ ** tuoteluetteloon. ** ** Globaalit: TARKENNIN (vakio jono) ** EROTTIMET (vakio jono) ** Sy”tt”: P„„tteelt„, ** tiedostosta ** Tulostus: N„yt”lle ** Kutsuu: f_lue_jono, lue_jono, N_S (makro), kopioi_jono, liita_jono, ** luo_tuotetaulukko, lisaa_tuote_rivi, ** kylla_vastaus, odota_jotakin ---------------------------------------------------------------------------*/ { #define PALAUTA(sanoma) {paluu_viesti = sanoma; goto sulje;} FILE *f; char jono[400],apu[50], *viesti, *paluu_viesti = NULL; int vikoja=0; rekisteri->nykytuote = 0; rekisteri->max_tuotteita = MAX_TUOTTEITA; rekisteri->tuotteita = 0; do { /* Kysell„„n kunnes tiedosto l”ytyy! */ printf(" Anna liikkeen nimi>"); if ( lue_jono(N_S(rekisteri->tiedoston_nimi)) <= OLETUS ) return NIMEA_EI_ANNETTU; kopioi_jono(N_S(jono),rekisteri->tiedoston_nimi); liita_jono (N_S(jono),TARKENNIN); if ( !(f=fopen(jono,"rt")) ) { /* Avaus ei onnistu! Luodaanko? */ printf(" Liikkeen %s tuotetietoja ei ole!\n",rekisteri->tiedoston_nimi); printf(" Luodaanko liikkeelle tuoterekisteri (K/e):"); if ( kylla_vastaus() ) return luo_rekisteri(rekisteri); } /* Avaus ei onnistu! Luodaanko? */ } while (!f); /* Kunnes tiedosto l”ytyy! */ /* Luetaan tiedostosta rekisterin nimi ja max_koko sek„ luodaan tuotetaulukko */ if ( f_lue_jono(f,N_S(rekisteri->liikkeen_nimi)) < OLETUS ) PALAUTA(TIEDOSTO_VAARIN); if ( f_lue_jono(f,N_S(jono)) < OLETUS ) PALAUTA(TIEDOSTO_VAARIN); sscanf(jono,"%d",&rekisteri->max_tuotteita); if ( (viesti=luo_tuotetaulukko(rekisteri,rekisteri->max_tuotteita))!=NULL ) PALAUTA(viesti); /* Luetaan tuotetiedot: */ 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_tuote_rivi(rekisteri,jono) ) { printf("*** Ei saada lis„tty„: %s ***\n",apu); vikoja++; } } sulje: fclose(f); if (vikoja) { printf(" %d tuotetta j„i lis„„m„tt„!\n",vikoja); odota_jotakin(); } return paluu_viesti; #undef PALAUTA } /***************************************************************************/ int /* */ tuote_riviksi( /* 0 = onnistuu 1 = ei onnistu */ Tuote_tyyppi *tuote, /* s Tuote, joka muutetaan. */ char *rivi, /* t Rivi, jonne tuote muutetaan. */ int max_pit /* s Rivin maksimipituus. */ ) /* ** Funktiolla muutetaan tuote yhdeksi riviksi, jossa kent„t on erotettu ** toisistaan erotinmerkill„. ** ** Kutsuu: int_jonoksi, double_jonoksi ** Esimerkki: ** tuote = 110001,A-piim„ 1l,3,10,8,3.15,... ** rivi = "110001|A-piim„ 1l|3|10|8|3.15..." ---------------------------------------------------------------------------*/ { #define LIITA_RIVIIN(jono) { liita_jono(rivi,max_pit,jono); \ liita_jono(rivi,max_pit,"|"); } char st[80]; Tuote_era_tyyppi *era; rivi[0] = 0; /* Tyhjennet„„n tulosjono. */ LIITA_RIVIIN(tuote->tuotenumero); LIITA_RIVIIN(tuote->nimi); int_jonoksi(N_S(st),tuote->sailyvyysaika,"%d"); LIITA_RIVIIN(st); int_jonoksi(N_S(st),tuote->taydennysraja,"%d"); LIITA_RIVIIN(st); int_jonoksi(N_S(st),tuote->keskim_myynti,"%d"); LIITA_RIVIIN(st); double_jonoksi(N_S(st),tuote->yksikkohinta,"%4.2lf"); LIITA_RIVIIN(st); era = tuote->tuote_erat; while (era) { int_jonoksi(N_S(st),era->maara,"%d"); LIITA_RIVIIN(st); pvm_jonoksi(N_S(st),&era->pvm); LIITA_RIVIIN(st); era = era->seuraava; } return 0; #undef LIITA_RIVIIN } static char *EI_TALLETU = " Rekisterin talletus ei onnistu!"; static char *EI_AUKEA_K = " Tiedostoa ei voi avata kirjoittamista varten!"; /***************************************************************************/ char /* NULL = onnistui */ *talleta_rekisteri( /* muut = virheilmoitus merkkijonona */ Rekisteri_tyyppi *rekisteri /* s Talletettava rekisteri. */ ) /* ** Funktiolla talletetaan tuoterekisteri. Vanha tiedosto nimet„„n ensin ** nimi.VANHATARK. ** ** Globaalit: VANHATARK ** TARKENNIN ** Tulostus: Tiedostoon ** Kutsuu: kopioi_jono, liita_jono, tuote_riviksi, N_S (makro) ---------------------------------------------------------------------------*/ { #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),rekisteri->tiedoston_nimi); liita_jono (N_S(bak_nimi),VANHATARK); kopioi_jono(N_S(jono) ,rekisteri->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",rekisteri->liikkeen_nimi)==EOF ) PALAUTA(EI_TALLETU); if ( fprintf(f,"%d\n",rekisteri->max_tuotteita)==EOF ) PALAUTA(EI_TALLETU); for (i=0; ituotteita; i++) { tuote_riviksi(rekisteri->tuotteet[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", rekisteri->tiedoston_nimi,TARKENNIN); if (vanhat_tallessa) printf(" Vanhat tiedot tiedostossa %s%s\n", rekisteri->tiedoston_nimi,VANHATARK); return paluu; #undef PALAUTA }