ongelma tiedoston ensimmäisen numeron

kasvattamisessa yhden suure...

eli miten kasvatttaa tiedoston ensimmäistä numeroa yhden isommaksi aina kun ohjelma ajetaan.

luvun saan luettua tiedostosta muuttujaan, saan ohjelmassa kasvatettua muuttujaa yhdellä, mutta en saa tallennettua tuota tietoa tuohon samaan paikkaan. Olen yrittänyt käyttää tuossa tiedoston käpistelyä a moodilla.

(Lisään myös jokaisella ohjelman kierroksella tietoa tiedostoon a-moodilla ja se onnistuu kyllä.)

5

511

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • r+ moodilla

      korjaan r moodilla

      • tehnyt ja osittain toimii

        #include
        #include

        int main(void)
        {

        char etunimi[20];
        char sukunimi[20];
        char puhelinnumero[20];
        int rivien_maara;

        printf("Anna etunimi:");
        scanf("%s",&etunimi[0]);
        printf("Anna sukunimi:");
        scanf("%s",&sukunimi[0]);
        printf("Anna puhelinnumero:");
        scanf("%s",&puhelinnumero[0]);

        FILE *avaus;
        char *tiedoston_nimi = "luettelo.txt";
        char *avaus_moodi = "a"; //lisätään tiedostoon
        avaus = fopen(tiedoston_nimi, avaus_moodi);

        if(avaus == NULL)
        {
        printf("Tiedoston a -avauksessa on tapahtunut virhe!");

        return 0;
        }
        else
        {
        fprintf(avaus, "\n%s %s %s", etunimi, sukunimi, puhelinnumero);
        }

        FILE *avaus2;
        char *avaus_moodi2 = "r ";
        avaus2 = fopen(tiedoston_nimi, avaus_moodi2);

        if(avaus2 == NULL)
        {
        printf("Tiedoston r -avauksessa on tapahtunut virhe!");

        return 0;
        }
        else
        {
        fscanf(avaus2, "%d", &rivien_maara);
        //printf("1:%d\n", rivien_maara);
        rivien_maara ;
        fprintf(avaus2, "%d", rivien_maara);

        fclose(avaus2);    
        }

        printf("\nTietojen tallennus onnistui.");    
        getche();
        return 0;

        }

        -----------
        eli tiedot nimi/numero-tiedot kyllä menee tiedostoon, saan luettue ensimmäisenä olevan numerotiedon(joka käytännössä kertoo montako riviä siellä on tietoa) mutta sen kasvattaminen yhdellä ei onnistu.


      • fidel1
        tehnyt ja osittain toimii kirjoitti:

        #include
        #include

        int main(void)
        {

        char etunimi[20];
        char sukunimi[20];
        char puhelinnumero[20];
        int rivien_maara;

        printf("Anna etunimi:");
        scanf("%s",&etunimi[0]);
        printf("Anna sukunimi:");
        scanf("%s",&sukunimi[0]);
        printf("Anna puhelinnumero:");
        scanf("%s",&puhelinnumero[0]);

        FILE *avaus;
        char *tiedoston_nimi = "luettelo.txt";
        char *avaus_moodi = "a"; //lisätään tiedostoon
        avaus = fopen(tiedoston_nimi, avaus_moodi);

        if(avaus == NULL)
        {
        printf("Tiedoston a -avauksessa on tapahtunut virhe!");

        return 0;
        }
        else
        {
        fprintf(avaus, "\n%s %s %s", etunimi, sukunimi, puhelinnumero);
        }

        FILE *avaus2;
        char *avaus_moodi2 = "r ";
        avaus2 = fopen(tiedoston_nimi, avaus_moodi2);

        if(avaus2 == NULL)
        {
        printf("Tiedoston r -avauksessa on tapahtunut virhe!");

        return 0;
        }
        else
        {
        fscanf(avaus2, "%d", &rivien_maara);
        //printf("1:%d\n", rivien_maara);
        rivien_maara ;
        fprintf(avaus2, "%d", rivien_maara);

        fclose(avaus2);    
        }

        printf("\nTietojen tallennus onnistui.");    
        getche();
        return 0;

        }

        -----------
        eli tiedot nimi/numero-tiedot kyllä menee tiedostoon, saan luettue ensimmäisenä olevan numerotiedon(joka käytännössä kertoo montako riviä siellä on tietoa) mutta sen kasvattaminen yhdellä ei onnistu.

        kun luet tiedoston alussa olevan rivimääränumeron, tiedosto-osoitin siirtyy yhden merkin verran eteenpäin. Jos suoraan tämän jälkeen kirjoitat jotain tiedostoon, et enää kirjoita tiedoston alkuun. Eli kutsu rivien_maara-muuttujan kirjoittamista funktiota rewind (siis näin: "rewind(avaus2);"), niin tiedosto-osoitin siirtyy takaisin tiedoston alkuun.

        Homma menee muuten ihan metsiin myös silloin, jos luettelo.txt-tiedostossa ei ole ensimmäisen merkkinä numeroa, esim. jos tiedosto on tyhjä. Eli varmista, että tiedostossa on aina rivimäärää merkitsevä merkki ekana, tai kirjoita jonkinlainen poikkeuskäsittely.

        Ja vielä, et sulje avaus-tiedostopointteria missään vaiheessa. Ei välttämättä aiheuta ongelmia, mutta kyllä se varmaan ihan hyvä idea olisi.


      • puuttuu tosiaan tuosta
        fidel1 kirjoitti:

        kun luet tiedoston alussa olevan rivimääränumeron, tiedosto-osoitin siirtyy yhden merkin verran eteenpäin. Jos suoraan tämän jälkeen kirjoitat jotain tiedostoon, et enää kirjoita tiedoston alkuun. Eli kutsu rivien_maara-muuttujan kirjoittamista funktiota rewind (siis näin: "rewind(avaus2);"), niin tiedosto-osoitin siirtyy takaisin tiedoston alkuun.

        Homma menee muuten ihan metsiin myös silloin, jos luettelo.txt-tiedostossa ei ole ensimmäisen merkkinä numeroa, esim. jos tiedosto on tyhjä. Eli varmista, että tiedostossa on aina rivimäärää merkitsevä merkki ekana, tai kirjoita jonkinlainen poikkeuskäsittely.

        Ja vielä, et sulje avaus-tiedostopointteria missään vaiheessa. Ei välttämättä aiheuta ongelmia, mutta kyllä se varmaan ihan hyvä idea olisi.

        Minulla ainakin lukee sieltä tiedostosta 0:n jos tiedosto on vielä tyhjä.

        avaus-tiedostopointterin sulkeminen puuttuu tosiaan tuosta. Aikaisemmin oli vain tuo avaus unohtui kun lisäsin tuon avaus2-tiedostopointterin.

        pitää kokeilla tuota rewind. ei ole tuollainen tullut vielä vastaan. Kiitoksia neuvoista.


    • homma bueno

      homma bueno.
      rewind ratkaisi ongelma.
      meni pieni hetki (melkein kaksi kuukautta) kunnes palasin kyseisen tehtävän pariin.

      kiitos neuvojille.

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Björn Wahlroos, maataloustuet lakkautettava

      Sanoo pankkimies. Mitäs persut ja muut tukinulliem perskärpäset tähän? "Wahlroos listaa kansallisen maataloustuen. – I
      Maailman menoa
      117
      3113
    2. Persut päättivät hiilivoiman kieltämisestä Suomessa

      Moni on jo unohanut kuka hyväksyi hiilivoimaloiden kieltämisen Suomessa: persut Sukupuolineutraalit liikennemerkitk
      Maailman menoa
      60
      2789
    3. Nalle Wahlroos ei ulise kuten Teemu Selänne sähkölaskuista

      Nalle "hah hah" nauroi saamistaan sähkötuista, kun taas Teemu-poika itkeä tirautti kovasta sähkön hinnasta. Nalle nauro
      Maailman menoa
      35
      2172
    4. Muistattekos kuinka kokoomus ja persut vinkuivat sähkön hinnasta?

      Oppositiossa vuonna 2022, kun sähkön hinta uhkasi nousta 20 senttiin kilowattitunnilta? Nyt ovat hiiren hiljaa, kun pitä
      Maailman menoa
      101
      2091
    5. Mikä aate kaiken pahan takana?

      Se laiskistuttaa kansat, opettaa vaatimaan etuisuuksia, syleilee maailmoja eikä omaa kansaa.
      Maailman menoa
      125
      1940
    6. Vain persut vastustivat hiilivoimaloiden alasajoa

      Persut vastusti jyrkästi hiilen kieltolakia ja on myöhemmin vaatinut hiilivoimaloiden pitämistä käytössä. He perusteliva
      Maailman menoa
      44
      1931
    7. Muistan vuosikymmenten takaa

      Toivottavasti voit hyvin ja jaksat työssäsi. Olet upea ja erinomainen ihminen, toivon kaikkea hyvää.
      Ikävä
      9
      1107
    8. Kristinoppi ja vähäkatekismus:

      Luther Lapsikasteesta: "Mitä kaste antaa eli hyödyttää? Kaste vaikuttaa syntien anteeksiantamuksen, vapauttaa kuolemas
      Luterilaisuus
      67
      974
    9. Päivi Räsäsen seksipaljastus loksauttaa Katja Ståhlin leuat! Elämäni biisi kohujakso tv:ssä!

      Elämäni biisi -suosikkisarjan uusinnat ovat startanneet ja nyt vuorossa on sarjan 2. jakso v. 2019. Sinisille sohville
      Suomalaiset julkkikset
      11
      908
    10. Valtuuston puheenjohtaja ei hallitse kokousta

      Kemijärven kaupunginvaltuuston puheenjohtaja antoi teatterin pyöriä valtuustossa. Sosialidemokraattien Risto Korkalon pu
      Kemijärvi
      77
      880
    Aihe