Rivin sanoihin viittaaminen

tiedostossa....

Hei,

Minulla on tiedosto, jossa on jokaisella rivillä 5 sanaa, tyyliin:
jaska jokunen tietotia1 00100 hki
aku ankka ankkalinnantie1 313 ankkalinna

Onko keinoa, jolla voisin viitata esim. toisen rivin sanaan 2 ja 3, eli tulostaisin nuo ohjelmassani tiedoston sisältä?

9

758

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • TRRY

      Avaa tiedosto (fopen), ja lue rivit fscanf("%s %s %s %s %s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka).

      • mutta...

        Eipä tuo toiminutkaan... :/

        ongelma lienee se, että mulla on noi tiedot CSV -tiedostossa ja eihän siinä olekaan nuo tiedot erikseen kun notepadilla tarkastelee (eikä excelillä), vaan tiedot on eritetty puolipisteellä....

        Oisko vinkkejä miten saan parsittua puolipisteillä erotetut tiedot tiedostosta esimerkillisellä tavalla?


      • hemmoit
        mutta... kirjoitti:

        Eipä tuo toiminutkaan... :/

        ongelma lienee se, että mulla on noi tiedot CSV -tiedostossa ja eihän siinä olekaan nuo tiedot erikseen kun notepadilla tarkastelee (eikä excelillä), vaan tiedot on eritetty puolipisteellä....

        Oisko vinkkejä miten saan parsittua puolipisteillä erotetut tiedot tiedostosta esimerkillisellä tavalla?

        fscanf("%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka).


        toinen tapa tässä

        http://www.cppreference.com/stdstring/strtok.html


      • aloittaja....
        hemmoit kirjoitti:

        fscanf("%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka).


        toinen tapa tässä

        http://www.cppreference.com/stdstring/strtok.html

        Olen nyt yrittänyt seuraavasti lukea ensimmäisen tiedostossa olevan rivin:
        #include
        #include
        #include
        #include
        #include
        using namespace std;

        int main()
        {
        char enimi, snimi, katu, pnro, ptpaikka = 0;
        FILE *tiedosto;
        tiedosto = fopen("nimitiedot.csv", "r");
           if(fscanf(tiedosto, "%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka) == 5)
           {
           fclose(tiedosto);
           return EXIT_SUCCESS;
           }
        }

        Osaisko joku hjelpata, mikä tuossa mättää? :/


      • TRRY
        aloittaja.... kirjoitti:

        Olen nyt yrittänyt seuraavasti lukea ensimmäisen tiedostossa olevan rivin:
        #include
        #include
        #include
        #include
        #include
        using namespace std;

        int main()
        {
        char enimi, snimi, katu, pnro, ptpaikka = 0;
        FILE *tiedosto;
        tiedosto = fopen("nimitiedot.csv", "r");
           if(fscanf(tiedosto, "%s;%s;%s;%s;%s\n", &enimi, &snimi, &katu, &pnro, &ptpaikka) == 5)
           {
           fclose(tiedosto);
           return EXIT_SUCCESS;
           }
        }

        Osaisko joku hjelpata, mikä tuossa mättää? :/

        Koodissasi on tällä hetkellä pielessä pari asiaa. Ensinnäkin, koska tämä oli "C-ohjelmointi"-palsta, etkä tarkentanut ohjelmointikieltä, sait apua C-kielellä. Nykyisen koodisi alkuloitsut ovat kuitenkin C :aa. Jos haluat C-kielisen ratkaisun, heitä roskiin kaikki nykyiset #include-rivit ja niitä seuraava using-rivi. Tehtävään riittää stdio-kirjasto, eli kirjoita alkuun vain #include .

        Toinen ongelma on muistinvaraus. enimi-muuttujaan ja muihin vastaaviin muuttujiin mahtuu tietoa yhden merkin (char) verran. Kun annat fscanf:lle parametrin "&enimi", annat sille muistiosoitteen tuohon yhden merkin mittaiseen muistipaikkaan. Siihen fscanf:n pitäisi kirjoittaa jäsentämänsä merkkijono. Mikään ei-tyhjä merkkijono ei kuitenkaan mahdu siihen, koska jokainen C-merkkijono päättyy erityiseen lopetusmerkkiin, joka tietenkin tarvitsee yhden merkin muistia.

        Varaa siis merkkijonoille enemmän muistia. Jos kaikki sanat ovat esimerkiksi alle 30 merkin mittaisia, määrittele muuttujat

        char enimi[30], snimi[30], katu[30], ...;

        ja voit vielä varmuuden vuoksi määritellä fscanf:ssä

        fscanf(tiedosto, ")s;)s;)s;)s;)s\n", ...)

        jolloin fscanf ei yritä vahingossakaan kirjoittaa mihinkään muuttujista niin montaa merkkiä, ettei se mahtuisi varattuun muistiin.

        Ja jos sinun ei ole pakko tehdä hommaa C:llä, olisit jo jäsentänyt merkkijonot kaksirivisellä Python-ohjelmalla:

        for rivi in file("nimitiedot.csv"): print "etunimi:", rivi.split(";")[0]


      • aloittaja...
        TRRY kirjoitti:

        Koodissasi on tällä hetkellä pielessä pari asiaa. Ensinnäkin, koska tämä oli "C-ohjelmointi"-palsta, etkä tarkentanut ohjelmointikieltä, sait apua C-kielellä. Nykyisen koodisi alkuloitsut ovat kuitenkin C :aa. Jos haluat C-kielisen ratkaisun, heitä roskiin kaikki nykyiset #include-rivit ja niitä seuraava using-rivi. Tehtävään riittää stdio-kirjasto, eli kirjoita alkuun vain #include .

        Toinen ongelma on muistinvaraus. enimi-muuttujaan ja muihin vastaaviin muuttujiin mahtuu tietoa yhden merkin (char) verran. Kun annat fscanf:lle parametrin "&enimi", annat sille muistiosoitteen tuohon yhden merkin mittaiseen muistipaikkaan. Siihen fscanf:n pitäisi kirjoittaa jäsentämänsä merkkijono. Mikään ei-tyhjä merkkijono ei kuitenkaan mahdu siihen, koska jokainen C-merkkijono päättyy erityiseen lopetusmerkkiin, joka tietenkin tarvitsee yhden merkin muistia.

        Varaa siis merkkijonoille enemmän muistia. Jos kaikki sanat ovat esimerkiksi alle 30 merkin mittaisia, määrittele muuttujat

        char enimi[30], snimi[30], katu[30], ...;

        ja voit vielä varmuuden vuoksi määritellä fscanf:ssä

        fscanf(tiedosto, ")s;)s;)s;)s;)s\n", ...)

        jolloin fscanf ei yritä vahingossakaan kirjoittaa mihinkään muuttujista niin montaa merkkiä, ettei se mahtuisi varattuun muistiin.

        Ja jos sinun ei ole pakko tehdä hommaa C:llä, olisit jo jäsentänyt merkkijonot kaksirivisellä Python-ohjelmalla:

        for rivi in file("nimitiedot.csv"): print "etunimi:", rivi.split(";")[0]

        Kiitos edellisestä.

        Tosiaan C :lla olisi tarkoitus tätä vääntää...
        En haluaisi Pythonia tähän sekottaa, vaan ihan pelkällä c :lla...

        Nyt olen päässyt tällaiseen vaiheeseen, lienen oikeilla jäljillä mutta nyt on taas nuo puolipisteillä erotettavat tiedot ongelmana...

        #include
        #include
        #include
        #include
        #include

        using namespace std;

        int main()
        {
        char enimi[40], snimi[40], katu[40], pnro[40], ptpaikka[40];
        string rivi;

        ifstream tiedosto("nimitiedot.csv");
        // avataan tiedosto lukemista varten
        tiedosto.open("nimitiedot.csv", ios_base::in);

              // luetaan puolipisteillä erotetut tiedot tiedostosta muuttujiin
              while( tiedosto )
              {
                 /* tähän yritin jo kaikenlaista mutta erroria vaan pukkaa tai
                 sitten ei tulostu mitään */
              }

              // suljetaan lopuksi tiedosto
              tiedosto.close();
              return EXIT_SUCCESS;      
        }


      • TRRY
        aloittaja... kirjoitti:

        Kiitos edellisestä.

        Tosiaan C :lla olisi tarkoitus tätä vääntää...
        En haluaisi Pythonia tähän sekottaa, vaan ihan pelkällä c :lla...

        Nyt olen päässyt tällaiseen vaiheeseen, lienen oikeilla jäljillä mutta nyt on taas nuo puolipisteillä erotettavat tiedot ongelmana...

        #include
        #include
        #include
        #include
        #include

        using namespace std;

        int main()
        {
        char enimi[40], snimi[40], katu[40], pnro[40], ptpaikka[40];
        string rivi;

        ifstream tiedosto("nimitiedot.csv");
        // avataan tiedosto lukemista varten
        tiedosto.open("nimitiedot.csv", ios_base::in);

              // luetaan puolipisteillä erotetut tiedot tiedostosta muuttujiin
              while( tiedosto )
              {
                 /* tähän yritin jo kaikenlaista mutta erroria vaan pukkaa tai
                 sitten ei tulostu mitään */
              }

              // suljetaan lopuksi tiedosto
              tiedosto.close();
              return EXIT_SUCCESS;      
        }

        #include
        #include

        using namespace std;

        int main() {
        ifstream f("nimitiedot.csv");
        char enimi[40]; // ja muut...
        while (! f.eof()) {
        f.getline(enimi, 40, ';');
        // lue tässä loputkin samaan tapaan, paitsi viimeinen kenttä
        // seuraavasti, koska se ei lopu puolipisteeseen:
        f.getline(ptpaikka, 40);
        }
        f.close();
        }


      • ei toimi :/
        TRRY kirjoitti:

        #include
        #include

        using namespace std;

        int main() {
        ifstream f("nimitiedot.csv");
        char enimi[40]; // ja muut...
        while (! f.eof()) {
        f.getline(enimi, 40, ';');
        // lue tässä loputkin samaan tapaan, paitsi viimeinen kenttä
        // seuraavasti, koska se ei lopu puolipisteeseen:
        f.getline(ptpaikka, 40);
        }
        f.close();
        }

        Tuota esimerkkisi silmukkaa en saanut toimimaan, mutta heitin siihen tällaisen silmukan:
        while(getline(tiedosto, rivi))
              {
                 tiedosto.getline(enimi, 40, ';');
                 tiedosto.getline(snimi, 40, ';');
                 tiedosto.getline(katu, 40, ';');
                 tiedosto.getline(pnro, 40, ';');
                 tiedosto.getline(ptpaikka, 40, ';');

           cout


      • Aloittaja...
        TRRY kirjoitti:

        #include
        #include

        using namespace std;

        int main() {
        ifstream f("nimitiedot.csv");
        char enimi[40]; // ja muut...
        while (! f.eof()) {
        f.getline(enimi, 40, ';');
        // lue tässä loputkin samaan tapaan, paitsi viimeinen kenttä
        // seuraavasti, koska se ei lopu puolipisteeseen:
        f.getline(ptpaikka, 40);
        }
        f.close();
        }

        Itse olinkin mokannut tuon viimeisen sarakkeen...

        Nyt näyttäs pelittävän,
        suuret kiitokset!!!


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

    Luetuimmat keskustelut

    1. MIksi suurin osa persuista on alkoholisteja?

      Tätä jäin pohdiskelemaan....
      Maailman menoa
      43
      3487
    2. 35
      2968
    3. Kehutaan vaihteeksi Perussuomalaisia

      Perussuomalaiset ovat olleet melkoisen lokakampanjoinnin kohteena, vaikka ovat saaneet paljon hyvää aikaiseksi. Nyt on
      Maailman menoa
      142
      2823
    4. SDP ylivoimainen ykkönen

      En ole koskaan viitsinyt käydä äänestämässä, mutta nyt SDP:n etumatka on niin kutkuttava, että pakkohan se on vaivautua.
      Maailman menoa
      70
      2307
    5. Roiskeläpät takaisin niin alkaa lasit kestämään

      "Tuulilaseja hajottava talvi-ilmiö on ehkä ratkennut" Tämän päivän autoissa kun on esimerkiksi vanhempaa autokalustoa s
      Yleistä autoilusta
      41
      1782
    6. Polttomoottoriauto on köyhän merkki

      Kun ei ole varaa ostaa sähköautoa, niin joutuu köyhän autoa käyttämään.
      Maailman menoa
      86
      1555
    7. Mitä tarkalleen tunnet

      Minkälaisia tunteita sisälläsi liikkuu, kun tiedät, että ajattelen sinua lämmöllä ja jotain syttyy myös sinussa? Haluai
      Ikävä
      67
      1084
    8. Nainen, koska nähtiin viimeksi

      Mikä päivä? Tarkemminkin voit kohtaamistamme kuvailla. 🤗
      Ikävä
      51
      1026
    9. Kaivattusi ominaistuoksu?

      Itse vastaan juustonaksu 😅
      Ikävä
      77
      1017
    10. Syyskuussa 2025 ensirekisteröidyistä henkilöautoista 43 % oli täyssähköautoja.

      Niitä rekisteröitiin 2 592 eli 41 % enemmän kuin vuotta aiemmin. Syyskuussa 2025 rekisteröidyistä uusista henkilöautois
      Hybridi- ja sähköautot
      3
      847
    Aihe