kertokaapa mikä mättää

toimii osittain

Kertokaapa mikä mättää tuossa tiedoston ensimmäisen merkin kasvattamisessa yhdellä ja sen tallettamista tiedostoon. Muuten toimii

Eli alkutilanteessa vaikkapa koko tiedostoa ei ole olemassa. Ohjelma luo tiedoston ja lisää annetut tiedot tiedostoon. Paitsi ettei ensimmäiselle riville tule 1 ensimmäisellä ohjelman pyöräytyksellä.

Ohjelmassa on kommentissa jossa printataan tuo tiedostosta luettu kohta. Jos sen ottaa käyttöön voi huomata että se lukee kuitenkin tuon tiedon tiedostosta (voi kokeilla vaikkapa itse käsin tiedostoon laittamalla eka riville jonkin numeron). Jostain syystä ei kuitenkaan talleta yhdellä kasvatettua lukua.

Miksi? Mitä vikana?

----------------------------------------------

#include
#include

int main(void)
{

char etunimi[21]; // etunimi voi olla 15 merkkiä
char sukunimi[21]; // sukunimi 20 merkkiä
char puhelinnumero[20]; //puhelinnumero myös merkkijonona
//char tiedosto_nimi[12];
int rivien_maara;

//printf("Ohjelma tallentaa etunimesi ja sukunimesi tiedostoon.\n");
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"; //Uusi tieto lisätään tiedoston loppuun.
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);

fclose(avaus);
}

FILE *avaus2;
char *avaus_moodi2 = "r "; //Uusi tieto kirjoitetaan vanhan tiedon päälle tiedoston alkuun.
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 ;
//printf("2:%d", rivien_maara);
fprintf(avaus2, "%d", rivien_maara);

fclose(avaus2);    
}

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

}
-----------------------------------------

6

1091

    Vastaukset 6

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • if-else

      1) Ongelma on se, että yritä lukea ohjelmassa numeroa tiedoston ensimmäiseltä riviltä ja sitä siellä ei ole. Eli kun luot tiedoston, niin ensimmäiselle riville ei kirjoiteta numeroa. Voit korjata ongelman tallentamalla tallennuksen yhteydessä nollan tiedoston ensimmäiselle riville, kun tiedosto luodaan. Alla korjaus:

      --- ALKAA ---

         if (ftell(avaus) == 0L)
            fprintf(avaus, "0");
         fprintf(avaus, "\n%s %s %s", etunimi, sukunimi, puhelinnumero);
         fclose(avaus);

      --- LOPPUU ---


      2) Kun kirjoitat numeron uusiksi tiedostoon, niin kirjoitat sen väärään paikkaan, eli et kirjoita sitä tiedoston alkuun vanhan päälle. Voit korjata ongelman siirtämällä osoittimen takaisin tiedoston alkuun ennen numeron kirjoittamista, jolloin numero alkaa samasta kohtaa kuin vanha numero. Alla korjaus:

      --- ALKAA ---

         fscanf(avaus2, "%d", &rivien_maara);
         fseek(avaus2, 0, SEEK_SET);
         rivien_maara ;
         fprintf(avaus2, "%d", rivien_maara);
         fclose(avaus2);

      --- LOPPUU ---

      3) Huomioithan että tuo ohjelma toimi vain kun luku on pienempi kuin 10. Eli jos tiedostossa on 9 riviä, esim:

         "9\nMatti meikäläinen 343434\nMaija meikäläinen..."

      Seuraavan ajokerran jälkeen siellä onkin:

         "10Matti meikäläinen 343434\nMaija meikäläinen..."

      Eli rivin vaihto katoaakin, koska numeron onkin kasvanut yhdellä merkillä, jolloin se toinen merkki ylikirjoittaakin rivin vaihdon. Tämän ongelman järkevä ratkaiseminen riippuu siitä, saako tuota tiedoston formaattia muuttaa, eli pitääkö asiat (numerot ja merkkijonot) todellakin tallentaa teksti muodossa vai ei.


      4) Huomioithan, että kun kysyt pelkkää yhtä merkki jonoa, etunimi ei voi silloin sisältää välilyöntiä.

      • oikean numero

        kyllä se vaan lukee sieltä oikean numero. Jos tiedostoa ei ole se lukee sieltä 0. Jos tiedosto on niin se lukee sieltä sen mikä eka rivillä on. Kokeile koodia jos et usko

        Tee vaikka luettelo.txt -tiedosto. Laita ensimmäiselle riville vaikka jokin numero. Aja ohjelmalla. En tiedä miten nämä eri kääntäjät oikein toimii mutta Dev-Cpp:ssä ainakin menee noin.

        Ja miksei se muka kirjoita vanhan päälle tiedoston alkuun? r

        r    Tiedosto avataan lukemista ja kirjoittamista varten.   Tiedosto luodaan.   Uusi tieto kirjoitetaan vanhan tiedon päälle tiedoston alkuun.


      • tiedoston tulee olla tällainen
        oikean numero kirjoitti:

        kyllä se vaan lukee sieltä oikean numero. Jos tiedostoa ei ole se lukee sieltä 0. Jos tiedosto on niin se lukee sieltä sen mikä eka rivillä on. Kokeile koodia jos et usko

        Tee vaikka luettelo.txt -tiedosto. Laita ensimmäiselle riville vaikka jokin numero. Aja ohjelmalla. En tiedä miten nämä eri kääntäjät oikein toimii mutta Dev-Cpp:ssä ainakin menee noin.

        Ja miksei se muka kirjoita vanhan päälle tiedoston alkuun? r

        r    Tiedosto avataan lukemista ja kirjoittamista varten.   Tiedosto luodaan.   Uusi tieto kirjoitetaan vanhan tiedon päälle tiedoston alkuun.

        -------

        4
        Etunimi Sukunimi 050-3500980
        Matti Meikäläinen 041-3478924
        Brian Kottarainen 040-3980982
        Brita Kottarainen 05-4567393

        -------
        eli eka rivi kertoo montako nimeä tiedostoon on kirjoitettu.

        etunimen/sukunimen/puhelinnumeron pitää olla tekstimuotoisena ja tosiaan ei saa olla välilyöntiä.

        Yhä ihmeellisemmäksi tämä menee kun eräässä toisessa ympäristössä joka kerta kun tekstitiedostoon lisää etunimi sukunimi puhelinnumero tiedot tulee jostain syystä ylimääräinen rivinvaihto. hienoa.


      • if-else
        oikean numero kirjoitti:

        kyllä se vaan lukee sieltä oikean numero. Jos tiedostoa ei ole se lukee sieltä 0. Jos tiedosto on niin se lukee sieltä sen mikä eka rivillä on. Kokeile koodia jos et usko

        Tee vaikka luettelo.txt -tiedosto. Laita ensimmäiselle riville vaikka jokin numero. Aja ohjelmalla. En tiedä miten nämä eri kääntäjät oikein toimii mutta Dev-Cpp:ssä ainakin menee noin.

        Ja miksei se muka kirjoita vanhan päälle tiedoston alkuun? r

        r    Tiedosto avataan lukemista ja kirjoittamista varten.   Tiedosto luodaan.   Uusi tieto kirjoitetaan vanhan tiedon päälle tiedoston alkuun.

        Eipä tuo pysty lukemaan sitä numeroa ensimmäisellä keralla, kun siellä ei sellaista ole. Voit todeta sen vaikka tulostamalla muunnoksen/luvun yhteydessä tiedon siitä, onnistuiko numeron luku/muunnos, vai ei. Esim:

        --- ALKAA ---

           if (fscanf(avaus2, "%d", &rivien_maara) == 0)
              printf("Rivi määrä ei pystytty lukemaan");

        --- LOPPUU ---

        Jos ohjelma on toiminut koneellasi ilman ensimmäistä käsin laittoa, niin luulen sen johtuvan vain siitä, että rivien_maara -muuttuja on sinulla ollut jostain syystä nolla vaikka et ole alustanut sitä, jolloin numeron luvun/muunnoksen epäonnistuminen ensimmäisellä ajo kerralla antaa rivi määräksi tavalaan nollan.

        Se ei kirjoita vanhan päälle, eli tiedoston alkuun, koska ennen kirjoittamista tiedostoa luetaan, jolloin osoitin on siirtynyt pois tiedoston alussa. Osoitin pitää siirtää tiedoston alkuun ennen kirjoittamista. Jos se on toiminut koneellasi, niin ehkä osoitin on pyörähtänyt ympäri.

        Voit kirjoittaa myös vanhan päälle, mutta se on kuitekin ongelma. Jos tiedostosi on:

        -------

        4
        Etunimi Sukunimi 050-3500980
        Matti Meikäläinen 041-3478924
        Brian Kottarainen 040-3980982
        Brita Kottarainen 05-4567393

        -------

        jos nyt kirjoitat vanhan päälle, tiedoston alkuun, vaikkapa jonon "100", niin tiedostosi onkin sen jälkeen muotoa:

        -------

        100tunimi Sukunimi 050-3500980
        Matti Meikäläinen 041-3478924
        Brian Kottarainen 040-3980982
        Brita Kottarainen 05-4567393

        -------

        Eli jonon "100":n toinen merkki meni rivinvaihdon päälle, ja kolmas merkki 'E' kirjaimen päälle. Epäilen ettei tämä ole täysin sitä mitä haluat.



        Eri järjestelmissä merkitään rivinvaihtoa eri tavalla. Windows ympäristöissä rivinvaihto, eli se '\n' on kahden tavun mittainen (CR LF), eli sisältäen sekä kelkan palautuksen (CR) että rivin vaihdon (LF) koodin. Kuvauksesi rivin vaihto ongelmasta kuulostaa kuin saattaisit katsella Windows ympäristön teksti tiedostoa Linux ympäristön editorilla.


      • if-else
        oikean numero kirjoitti:

        kyllä se vaan lukee sieltä oikean numero. Jos tiedostoa ei ole se lukee sieltä 0. Jos tiedosto on niin se lukee sieltä sen mikä eka rivillä on. Kokeile koodia jos et usko

        Tee vaikka luettelo.txt -tiedosto. Laita ensimmäiselle riville vaikka jokin numero. Aja ohjelmalla. En tiedä miten nämä eri kääntäjät oikein toimii mutta Dev-Cpp:ssä ainakin menee noin.

        Ja miksei se muka kirjoita vanhan päälle tiedoston alkuun? r

        r    Tiedosto avataan lukemista ja kirjoittamista varten.   Tiedosto luodaan.   Uusi tieto kirjoitetaan vanhan tiedon päälle tiedoston alkuun.

        Tuossa ensimmäisessä korjaus koodissani, jossa katsottiin oliko tiedoston koko 0, oli virhe. Piti mennä:

        --- ALKAA ---

        fseek(avaus, 0, SEEK_END);
        if (ftell(avaus) == 0L)
        fprintf(avaus, "0");
        fprintf(avaus, "\n%s %s %s", etunimi, sukunimi, puhelinnumero);
        fclose(avaus);

        --- LOPPUU ---


        Joku jo antoikinhyvän ratkaisun siihen yli kirjoittamis ongelmaan.


    • KonaniPrain

      varataan 10 merkkiä (tai haluamasi määrä) numeroa varten tiedoston ensimmäiseltä riviltä:

      // jos tiedosto on tyhjä eli alussa
      if (ftell(avaus) == 0L)
      fprintf(avaus, "%-10d", 0);

      ...
      fscanf(avaus2, "%d", &rivien_maara);
      fseek(avaus2, 0, SEEK_SET); // tai rewind(avaus2);
      rivien_maara ;
      /* fprintf(avaus2, "%d", rivien_maara); */
      fprintf(avaus2, "%-10d", rivien_maara);
      fclose(avaus2);

      Lopputulos (piste tarkoittaa välilyöntiä):
      100.......
      Etunimi Sukunimi 050-3500980
      Matti Meikäläinen 041-3478924
      Brian Kottarainen 040-3980982
      Brita Kottarainen 05-4567393

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

    Luetuimmat keskustelut

    1. Mikä on totta mikä ei?

      Onko juoru vai ei että nimeltä mainitsematon henkilö on tehnyt naiselle/naisille jotain joka on väärin?
      Kuhmo
      22
      2334
    2. Päivän aivopieru Trumpilta

      Trump julisti sodan hyttysiä vastaan. Myös punkit ovat Trumpin sodan kohteena. Eikö vieläkään USA:n kansa tajua tuon uko
      Maailman menoa
      86
      1566
    3. Lopetetaanko tämä

      Juttu ja mennään eteenpäin? Pystytkö?
      Ikävä
      134
      982
    4. Just saying

      Mies joka antaa naiselle turvallisen olon, on seksikäs. Ei kieroja kikkoja ja haluaa olla vain sen yhden naisen mies.
      Ikävä
      143
      753
    5. Löytyikö syy miksi Martina on Muhiksen kanssa

      Saipa naurut Gekkosen kuvasta, missä ovat ravintola Hookissa Immu fight night ottelun jälkeen, Muhoksella pullottaa hirv
      Kotimaiset julkkisjuorut
      95
      692
    6. Voisin antaa sulle nyt

      Halin❤️
      Ikävä
      54
      686
    7. Janpen Thai lopettanut, miksiköhän

      Hyvää apetta teki.
      Suomussalmi
      13
      657
    8. Jos selviäisi että kaivattusi

      Olisi savant asperger? Rakastaisitko vielä? Savant-lahjakkuus olisi kapea-alaista neroutta liittyen mekanisiin ja tilan
      Ikävä
      99
      622
    9. Jorma Uotinen läväytti härskin heiton - Paljastus uudesta TTK-romanssista?

      Tuomari Jorma Uotisen linja on välillä hyvinkin rohkea TTK:ssa. Hän näpäytti Jaakko Parkkalille ja Kastanja Rauhalalle v
      Tanssii tähtien kanssa
      12
      618
    10. Älä unohda minua

      Nainen ethän unohda minua. Asiat olisivat voineet mennä toisin, olisi vain pitänyt uskaltaa lähestyä sinua kun annoit si
      Ikävä
      77
      605
    11. On väärin

      Tykätä ja haluta sua kun tilanne täysin mahdoton mutta minkäs teet. Mun sisällä roihuaa 🔥 kunpa tietäisit mitä sä minus
      Ikävä
      42
      583
    12. Tosi kiva on

      Joo. Mitä olisit menettänyt jos olisit paljastanut itsesi?
      Ikävä
      65
      571
    13. Toivotko vielä viestiä

      Minulta? En rohkene enää ottaa yhteyttä, kun varmasti jo uusia naisia elämässä. Nolaisin vain itseni.
      Ikävä
      44
      559
    14. Tehdään yhdessä itsestämme

      Parhaat versiot❤️ Se vaatii molemmilta hyvää itsetuntoa!
      Ikävä
      42
      540
    15. Olen ajellut Dieseleillä yli 50 vuotta.

      Enkä ole koskaan kaivannut sähköautoa.
      Hybridi- ja sähköautot
      139
      539
    16. Oliko Jani Halmeen aika jo tippua TTK:sta?

      Jani Halme ja Claudia Ketonen joutuivat jättämään TTK:n. Halme ja Ketonen saivat viimeiseksi jäänestä tanssista, sambas
      Tanssii tähtien kanssa
      29
      516
    17. Mitä tunteita

      Sulla vielä on?
      Ikävä
      77
      514
    18. Kuka kaipaa T m?

      Kerro nainen kirjaimesi vaan... Haluan miettiä kuka tulee ekana mieleeni.. kuin kurkistus tunteiden meren pinnalle, jota
      Ikävä
      36
      510
    19. Miksi jotku naiset on niin tyhmiä

      Että elättelevät turhaa toivoa toisen kustannuksella. Onko ne kaikki kaappilesboja vai mikä niitä vaivaa? Sitten itketä
      Ikävä
      54
      508
    20. S-ryhmän vastuullisuuden kaksoisstandardi

      Vastuullisuuspuhe on helppoa. Vaikeampaa on selittää, miksi S-ryhmän omien merkkien tuotteita ja raaka-aineita hankitaan
      Maailman menoa
      14
      490
    Aihe