Rivin sanoihin viittaaminen

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ä?
9803
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

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

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

    Äänestä

  • 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

    Äänestä

  • 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ää? :/

    Äänestä

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

    Äänestä

  • 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;      
    }

    Äänestä

  • 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();
    }

    Äänestä

  • 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

    Äänestä

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

    Äänestä

Kommentoi aloitusta


tiedostossa.... kirjoitti:

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ä?

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