Tiedostosta luku ja parsettaminen (C++)?

Mulla on ongelmana, että en osaa parsia tiedostosta lukemani rivin sisältöä. Koitin googeletella apuja, mutta ei siitä mitään tullut, kun joka esimerkkiin oli tungettu pointterikikkailuja tai jotain muuta pro-meininkiä. (pointtereiden hyötyä en o koskaan ymmärtänyt)

Luen tiedostosta rivejä, joissa on aina rivillä viisi numeroa, jotka on sitten erotettu tabulaattorilla toisistaan. Tavoitteena olisi lukea ne taulukkoon, jossa sitten voisin suorittaa luetulla rivillä olleilla numeroilla vertailuja.

1 2 3 4 5
6 7 8 9 10
2 3 4 5 6
jne...

Siis tähän tyyliin ne on filussa, mut tabulaattori välilyönnin tilalla.

Kannattaako mun käyttää 2-ulotteista taulukkoa: taulu [100][5]; että pääsen vertailemaan niitä rivin lukuja keskenään? Tällä hetkellä se lukee aina rivin 1-ulotteisen taulukon soluun.

/****************************/
string s;
           
    int laskuri=0;
    string filusta[100];
   
   
    //Luetaan tiedosto riveittäin taulukkoon
    while ( getline(fi,s) )
{   

filusta[laskuri]=s;
laskuri ;

continue;

}   
    fi.close();
/********************************/

Entä pitääkö mun suorittaa joku tyyppimuunnos, että noi luvut ovat oikeasti numeroita, eivätkä tekstiä?

Yritin sellasta, että int s; mutta se valitti jotain virhettä heti. Sitten koitin int numero =int(s); mutta taas heitti jotain erroria. Jotain tyyppierroria mun muistaakseni.
91060
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Tuohan onnistuu scanf:llä melko helposti. Luet vain rivin ja sitten scanf:llä teksti numeroiksi.

Äänestä

tarvitaan jos muuttaa char/int

atoi(),itoa()

mihin tarvitset 2ulotteisen taulukon? jos oikein tajusin niin et mihinkään.
//esim.
#include

char teksti[10]=("50234");
int i;
//teksti numeroiksi
i = atoi( teksti );

//numerot tekstiksi
itoa (i,teksti,10);

Äänestä

"pointtereiden hyötyä en o koskaan ymmärtänyt) "

no tässäpä nyt ongelmaasi liittyen? yksinkertaisesti.

jos et tiedä valmiiksi kuinka suuri luettavan tiedoston koko on niin mitä sitten kun muuttujasi string str[100] ylittyy?
sitten tulee(tai siis jo alunalkaen ja pois tuo str) kyseeseen pointterit ja new...

Äänestä
  • AINA osoittimia - kielestä riippumatta ? jos käytetään prosessorin hierarkiaa OIKEIN.

    Äänestä

  • prosessori käyttää kirjoitti:

    AINA osoittimia - kielestä riippumatta ? jos käytetään prosessorin hierarkiaa OIKEIN.

    riippuu siitä mitä tarkoitat "Perustasolla".
    Perustasolla prosessori käyttää ykkösiä ja nollia(virta päällä/virta pois päältä).

    Äänestä

  • puusilima_ kirjoitti:

    riippuu siitä mitä tarkoitat "Perustasolla".
    Perustasolla prosessori käyttää ykkösiä ja nollia(virta päällä/virta pois päältä).

    kytkiminä toimivien puolijohteitten rajapintojen yli varauksia - akseptorit ja donorit avainasemassa.

    :D

    Äänestä

Suosittelisin kyllä osoittemien oppimista koska paitsi että ne ovat käteviä ja säästävät muistia niin ne hyvin käytettynä helpottaa koodia huomattavasti. Mutta, jos käyttää C :an STL kirjastoa niin onnistuu se ilman osoittimiakin.
Tässä esimerkki:

#include
#include
#include
#include
using namespace std;

int main(int argc, char *argv[])
{
   /* Muuttujat */
   vector< vector > matriisi;
   vector m_rivi;
   string buffer;
   string::iterator it;
   ifstream tiedosto;
   stringstream arvo_s;
   int arvo;   
   
   /* Avataan tiedosto lukua varten */
   tiedosto.open ("tiedosto.txt");
   
   /* Luetaan tiedosto rivi riviltä ja tallennetaan matriisiin   */
   while( getline(tiedosto,buffer) )
   {
      /* Luodaan uusi rivi */
      m_rivi.clear();
   
      /* Muutetaan tekstirivin numerot luvuiksi(int) */
      for(it=buffer.begin(); it != buffer.end() ; it )      
         if(*it != '\t')
         {
            arvo_s > arvo; arvo_s.clear();
             m_rivi.push_back(arvo);
         }

      /* Tallennetaan rivi matriisiin */
      matriisi.push_back(m_rivi);   
   }

   /* Suljetaan tiedosto */
   tiedosto.close();

   /* Tulostetaan luettu matriisi */
   for(int i=0; i

Äänestä
  • "
    for(int i=0; i

    Äänestä

Kommentoi aloitusta


hbjhbjh kirjoitti:

Mulla on ongelmana, että en osaa parsia tiedostosta lukemani rivin sisältöä. Koitin googeletella apuja, mutta ei siitä mitään tullut, kun joka esimerkkiin oli tungettu pointterikikkailuja tai jotain muuta pro-meininkiä. (pointtereiden hyötyä en o koskaan ymmärtänyt)

Luen tiedostosta rivejä, joissa on aina rivillä viisi numeroa, jotka on sitten erotettu tabulaattorilla toisistaan. Tavoitteena olisi lukea ne taulukkoon, jossa sitten voisin suorittaa luetulla rivillä olleilla numeroilla vertailuja.

1 2 3 4 5
6 7 8 9 10
2 3 4 5 6
jne...

Siis tähän tyyliin ne on filussa, mut tabulaattori välilyönnin tilalla.

Kannattaako mun käyttää 2-ulotteista taulukkoa: taulu [100][5]; että pääsen vertailemaan niitä rivin lukuja keskenään? Tällä hetkellä se lukee aina rivin 1-ulotteisen taulukon soluun.

/****************************/
string s;
           
    int laskuri=0;
    string filusta[100];
   
   
    //Luetaan tiedosto riveittäin taulukkoon
    while ( getline(fi,s) )
{   

filusta[laskuri]=s;
laskuri ;

continue;

}   
    fi.close();
/********************************/

Entä pitääkö mun suorittaa joku tyyppimuunnos, että noi luvut ovat oikeasti numeroita, eivätkä tekstiä?

Yritin sellasta, että int s; mutta se valitti jotain virhettä heti. Sitten koitin int numero =int(s); mutta taas heitti jotain erroria. Jotain tyyppierroria mun muistaakseni.

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