Talletan tiedostoon nimiä omille riveilleen, mikä sujuu hyvin. Mutta tiedoston ensimmäisellä rivillä pitäisi olla luku joka ilmoittaa rivien lukumäärän, sen on siis kasvettava yhdellä aina kun lisään uuden nimen.
Tyyliin:
4
Anne
Antti
Mikko
Kaisa
rivien_lkm = 0;
...
rivien_lkm ;
ei toimi
Tyyliin:
4
Anne
Antti
Mikko
Kaisa
rivien_lkm = 0;
...
rivien_lkm ;
ei toimi
Vastaukset 7
Vanhimmat
Tarkennapas nyt vähän kohtaa "ei toimi". Esimerkki nykyisestä koodista kelpaa. Jonkun muuttujan muuttaminen ei tietenkään vaikuta suoraan tiedostossa olevaan riviin, jos sitä tarkoitat.
:)
koodia:
if((kirj = fopen("nimet.txt","a")) == NULL)
{
printf("tiedoston %s avaaminen epäonnistui\n");
return(0);
}
else {
nimien_maara++;
fprintf(kirj,"%d\n", nimien_maara);
for(i = 0; i < 1; i++){
fprintf(kirj,"%s %s %s\n", henkilo_lista[i].etunimi, henkilo_lista[i].sukunimi, henkilo_lista[i].puhelinnumero);
}
printf("Tietojen tallennus onnistui.\n");
}
näillä saan aikaan tiedoston:
1
etunimi sukunimi puhelinnumero
1
etunimi sukunimi puhelinnumero
1
etunimi sukunimi puhelinnumero
eli tuo numero on väärässä paikassa eikä se kasva.
Onpas melkosta koodia...
Ensinnäkin avaat tiedoston "a"-moodilla eli append eli "lisää perään". Joka kerta kun ohjelman käynnistät se lisää romua tiedoston loppuun.
Aina kun ohjelman käynnistät, niin nimien_maara on tietenkin 0, koska et sitä mistään lue, vaan olet alustanut sen nollaksi. Siksi se ei kasva vaan on tuon nimien_maara jälkeen aina yksi.
Nyt voitas miettiä, että miksi se nimien lukumäärä pitää olla siellä tiedostossa? Kirjoitat sen tiedostoon ENNEN kuin se uusi nimi edes menee tiedostoon. Eli uuden nimen lisäys saattais epäonnistua ja silti se numero kasvais. Eli ei kovin hyvä juttu.
Pitäis ensin lukea koko tiedosto taulukkoon. Lisätä taulukkoon uudet nimet ja vasta kun ohjelma suljetaan, niin kirjoittaa koko roina entisen tiedoston päälle.
Jos haluat kuitenkin tehdä tuon tolleen, niin lue ensin tiedoston eka rivi, niin voit sillä alustaa nimien_maara-muuttujan. Sitten lisäät tiedostoon uusia nimiä ja kasvatat samalla nimien_maaraa. Sitten kun nimet on laitettu, niin käytä fseek-funktiota ja kelaa sillä tiedosto-osoitin tiedoston alkuun ja kirjoita siihen se uusi luku. Sitten pysyy homma järjestyksessä.
>huh huh
:D kiitos kannustuksesta ;)
>Nyt voitas miettiä, että miksi se nimien
>lukumäärä pitää olla siellä tiedostossa?
Koska ope käskee.
Kiitos! Tajusin jotain ja yritän taas.
Luulin jo vastanneeni, sori jos tämä tulee kahdesti/kolmesti.
>Pitäis ensin lukea koko tiedosto taulukkoon.
>Lisätä taulukkoon uudet nimet ja vasta kun
>ohjelma suljetaan, niin kirjoittaa koko roina
>entisen tiedoston päälle.
Eikö tässä nyt näin tapahdukin, paitsi että nimiä lisätään yksi kerrallaan. Ja tarkoitus on että edelliset nimet jäävät talteen.
Poistin edellisestä koodista rivit:
nimien_maara++;
fprintf(kirj,"%d\n", nimien_maara);
Nyt saan nimet nätisti allekain tiedostoon.
Mutta tuota rivien lukumäärän ilmoittamista en ymmärrä. Avaanko tiedoston uudelleen, jotta voin lisätä sitä ensimmäistä numeroa. En ymmärrä. Fseek()-funktiota meillä ei vielä ole ollut.
... apuja.. ?
joo