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

501

    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. Miten Eerolan silmäkuvat voivat levitä muutamassa tunnissa ympäri maailmaa?

      Seuraako koko maailma persujen ja erityisesti Eerolan somea reaaliajassa? Edes kansanedustajan itsemurha eduskuntatalos
      Maailman menoa
      435
      6336
    2. Suomen kansa haluaa Antti Lindtmanista pääministerin

      Lindtman on miltei tuplasti suositumpi kuin etunimikaimansa Kaikkonen. Näin kertoo porvarimedian teettämä kysely. http
      Maailman menoa
      124
      3652
    3. Vain 21% kannattaa Lindtmania pääministeriksi

      se on selvästi vähemmän kuin puolueen kannatus, mites nyt noin?
      Maailman menoa
      95
      2439
    4. Miten löydän sinut

      Ja saan sanottua kaiken mitä haluan sinulle kertoa? Ja kuinka kuuntelisit minua sen hetken? Kuinka voin ilmaista sen mit
      Ikävä
      25
      1899
    5. Moraaliköyhä S-ryhmä

      S-ryhmä on kehystänyt Israel-boikottipäätöksen “ihmisoikeuslinjaukseksi”, mutta toteutus paljastaa sen onttouden: valiko
      Tampere
      111
      1271
    6. Yöllinen autolla kaahari Heinolan seudulla

      Asukkaita häiriköivän nuoren herran autokaahaus keskustelu poistettu, onko jokin hyvävelijärjestelmä käytössä ?
      Heinola
      92
      1234
    7. Minkä biisin omisit sun kaivatulle?

      Pieni perustelu olisi kiva. ❤️
      Ikävä
      63
      1055
    8. Onko kaivattusi

      seksuaalisesti vetovoimaisin ihminen jonka olet ikinä tavannut?
      Ikävä
      62
      1048
    9. Vaikea tilanne

      Hieman kolkuttaa omatuntoa, kun on osoittanut kiinnostusta väärää naista kohtaan. En ymmärrä miten toinen on voinut te
      Ikävä
      76
      950
    10. Milloin kaivatullasi

      .. on nimipäivä?
      Ikävä
      41
      924
    Aihe