ongelma tiedoston ensimmäisen numeron

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ä.)
5539
Äänestä

Muut lukivat myös

Vastaukset 5

Vanhimmat

korjaan r moodilla

Äänestä
  • #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.

    Äänestä

  • 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.

    Äänestä

  • 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.

    Äänestä

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

kiitos neuvojille.

Äänestä

Kommentoi aloitusta


kasvattamisessa yhden suure... kirjoitti:

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ä.)

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu