L 5,R 65,J,T 5 @ots(Korjaus: f_lue_jono) f_lue_jono aliohjelmassa on seuraava virhe: Esim kutsu BEGIN GESIMERKKI paluu=f_lue_jono(stdin,jono,6); END GESIMERKKI palauttaa arvon 1 (EI_MAHDU), mik„li sy”t”ksi annetaan BEGIN GESIMERKKI kissa[Ret] END GESIMERKKI Miksik”?. Koska fgets(jono,6,stdin) lukee rivilt„ 5kirjainta! Riville j„„ viel„ [Ret] (\n). Siis kokosy”tt”rivi ei mahdu ([Ret] mukaanlukien) jonoon. Loogisestijono kuitenkin mahtuisi! Siis aliohjelmaan pit„„ lis„t„t„m„ erikoistapauksena: L 5,R 93,J,T 5 BEGIN GESIMERKKI /****************************************************************************/ int /* 2 = jono sy”tettiin */ f_lue_jono( /* 1 = jono ei mahtunut */ /* 0 = painettiin heti RETURN */ /* -1 = */ /* -2 = virhe sy”t”ss„ */ FILE *f, /* s Tiedosto josta luetaan */ char *jono, /* t Merkkijono johon luetaan */ int max_pituus /* s Luettavien merk. max.lkm+1 (tila \0) */ ) /* ** Funktiolla luetaan tiedoston yhdelt„ rivilt„ korkeintaan ** max_pituus -mittainen merkkijono. Jonoon ei tule \n -merkki„. ** Tiedoston ollessa loppu palautetaan -1 mutta itse jonoon ei kosketa. ** Mik„li rivill„ ei yht„„n merkki„, palautetaan 0 samoin kuin jonona. ** Rivin loppuosa, joka ei mahdu jonoon h„vitet„„n. ** ** Sy”tt”: tiedostosta ** Tulostus: n„yt”lle jos stdin ** Tekij„: Vesa Lappalainen ** Pvm: 9.10.1991 ** Esimerkki: Kutsu f_lue_jono(f,jono,8) ** Tiedostossa rivit: palauttaa ** 1234567890123456789 jonon pituus f_lue_jono jono ** Kissa puussa 7 1 Kissa p\0 ** istuu 5 2 istuu\0 ** 0 0 \0 ** ja ihmettelee. 7 1 ja ihme\0 ** Joo! 4 2 Joo!\0 **- seuraava kutsu 4 -1 Joo!\0 ----------------------------------------------------------------------------*/ { int jonon_pituus,c; if ( feof(f) ) return TIEDOSTO_LOPPU; if ( fgets(jono,max_pituus,f)==NULL ) return VIRHE_SYOTOSSA; jonon_pituus = strlen(jono); if ( jono[jonon_pituus-1]=='\n' ) { /* Poistetaan mahd. \n */ jonon_pituus--; jono[jonon_pituus]=0; if ( jonon_pituus==0 ) return OLETUS; return SYOTTO_OK; } if ( feof(f) ) return SYOTTO_OK; c=fgetc(f); if (c=='\n') return SYOTTO_OK; while ( ((c=fgetc(f))!=EOF) && (c!='\n') ); /* Poistetaan rivin loppu. */ return EI_MAHDU; } END GESIMERKKI