Eli kun minulla on .dat tiedostossa näin
Toyota Corolla 12000 50 0 Fiat 133 16000 100 1 Ford Escort MK2 10000 80 1 Ford Escort MK1 8000 90 2
eli
merkki, hinta, hepat, omistajan "id".
niin miten voin hakea kaikki autot johonkin (luultavasti taulukko) muuttujaan mitkä sitten tulostetaan sdl_ttf:llä pihalle kun tarvitaan.
Pitäisi siis saada ainoastaan ne minkä "id" on se mitä etsitään.
(Mod. huom: oikeat kooditagit; eihän tuo ole C:tä)
Lue vaikka rivi kerrallaan ja katso onko id haettu ja jos on, niin tallenna taulukkoon. Lukemiseen olet minusta saanut valmiin koodin hetki sitten.
Kyllä, mutta miten sitä koodia voi toistaa rivi kerrallaan ettei tuo hae aina samalta riviltä?
mika132 kirjoitti:
Kyllä, mutta miten sitä koodia voi toistaa rivi kerrallaan ettei tuo hae aina samalta riviltä?
Helpottaisi huomattavasti, jos kertoisit, mistä ohjelmointikielestä on kyse. Jos käytät vaikka C:tä ja fscanf-funktiota, niin siirtyyhän se fscanf eteenpäin tiedostossa automaattisesti.
-tossu- kirjoitti:
Helpottaisi huomattavasti, jos kertoisit, mistä ohjelmointikielestä on kyse.
Eipä sillä ole paljon väliä, kun en tähän hätään keksi yhtäkään kieltä, jossa ei siirryttäisi automaattisesti eteenpäin.
Varmaan tässä haettava ratkaisu on niinkin perustavaa lajia, että tiedosto pitäisi avata siellä silmukan ulkopuolella, jottei silmukka aloita lukemista aina alusta. Siis:
funktio "haku": avaa tiedosto silmukka, kun ei olla tiedoston lopussa: lue rivi jos rivin id on oikea sulje tiedosto palauta id sulje tiedosto palauta arvo "ei löytynyt"
Metabolix kirjoitti:
Eipä sillä ole paljon väliä, kun en tähän hätään keksi yhtäkään kieltä, jossa ei siirryttäisi automaattisesti eteenpäin.
Kyselin tuota kieltä lähinnä sen takia, että esimerkkikoodin antaminen on huomattavasti helpompaa, jos tietää, millä kielellä se pitää kirjoittaa.
Metabolix kirjoitti:
Varmaan tässä haettava ratkaisu on niinkin perustavaa lajia, että tiedosto pitäisi avata siellä silmukan ulkopuolella, jottei silmukka aloita lukemista aina alusta. Siis:
funktio "haku": avaa tiedosto silmukka, kun ei olla tiedoston lopussa: lue rivi jos rivin id on oikea sulje tiedosto palauta id sulje tiedosto palauta arvo "ei löytynyt"
Tässä on ihan hyvä pohja aloittajalle ohjelman tekemiseen (millä tahansa kielellä) - ja ehkäpä olisi ihan hyvä jos aloittaja kokeilisi ensin tätä. Kuitenkin, aivan aloituspostin vaatimuksia tällä ei täytetä, sillä funktion ei suinkaan ole tarkoitus palauttaa ID:tä, vaan ilmeisesti ID:n rajaama joukko tietueita, muodossa jota aloittaja ei tarkemmin määritellyt - tietäneeköhän itsekään.
Sekin on ihan hyvä harjoitustehtävä; vinkiksi annettakoon, että siihen liittyy sopivan tietueen määrittely ja halutun listaformaatin valinta, koska ilmeisestikin yhteen ID:hen voi liittyä useampi tietue.
Jossain vaiheessa pitää myös valita ohjelmointikieli. C ei ole tässäkään tapauksessa helpoin valinta, mutta harjaannuttaa toki kielen käytössä. Monet aloittelevat (tai muuten epäpätevät) ohjelmoijat eivät kykene tällaista ohjelmaa C:llä tuottamaan, ja useat valitsevatkin "ohjelmointikielen" C/C++.
eq: Joo, unohdin jo, mitä aloittaja halusi tehdä. Koodi kuitenkin vastaa jälkimmäiseen kysymykseen ("miten sitä koodia voi toistaa rivi kerrallaan"). Tuosta on helppo muokata se haluttu algoritmi:
funktio "haku": alusta lista tyhjäksi avaa tiedosto silmukka, kun ei olla tiedoston lopussa: lue rivi jos rivi vastaa hakua: lisää rivi listaan sulje tiedosto palauta lista
Kyseessä on varmaankin C++, joten lista voisi olla esimerkiksi std::list tai std::vector.
hmm.. Löysin jonkin näköisen ohjeen, mutta en oikein ottanut siitä selvää ja sain kyhättyä tälläisen:
char str [80]; float f; FILE * pFile; AutonTiedot a;; std::ifstream virta("PlayersData.dat"); std::getline(virta, a.malli, '\t'); virta >> a.venttiilit >> a.hinta; virta.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); virta.close(); pFile = fopen ("PlayersData.dat","w+"); fprintf (pFile, "%f %s", a.venttiilit, a.malli); rewind (pFile); fscanf (pFile, "%f", &f); fscanf (pFile, "%s", str); fclose (pFile); printf ("Ventiili maara: %f ja malli: %s \n",f,str);
Siis tämähän heittää virheraporttia virheellä 0xC000001D.
Se mitä nyt yritin on se, että otetaan tiedot Auton tiedot olioon ja sitten suljetaan virta kahva ja aloitetaan pFile ja printataan aloituksessa saadut tiedot sen sisälle päivitetään jne.. mutta edes omasta mielestäni ei mitään logiikkaa, mutta enpä tähän hätään muutakaan keksinyt.
mika132 kirjoitti:
hmm.. Löysin jonkin näköisen ohjeen, mutta en oikein ottanut siitä selvää ja sain kyhättyä tälläisen:
Sama suomeksi:
luodaan alustamaton 80 merkin merkkijonopuskuri str luodaan alustamaton liukuluku f luodaan alustamaton tiedosto"kahva" pFile luodaan AutonTiedot-olio a avataan tiedosto "PlayersData.dat" lukemista varten (1) luetaan virrasta (1) '\t'-merkkiin asti merkkejä puskuriin a.malli luetaan (ja tulkitaan) virran (1) seuraavat merkit muuttujiin a.venttiilit ja a.hinta ohitetaan virrasta (1) loput merkit rivinvaihtoon asti suljetaan virta (1) avataan (sama) tiedosto "PlayersData.dat" lukemista ja kirjoittamista varten (2) (tyhjentäen samalla alkuperäinen tiedosto) kirjoitetaan virtaan (2) (alkuun) liukuluku a.venttiilit ja teksti a.malli (eri sisältö kuin alunperin!) kelataan virta (2) alkuun luetaan virrasta (2) liukuluku muuttujaan f luetaan virrasta (2) tekstiä puskuriin str suljetaan virta (2) tulostetaan teksti, jossa muuttujat f ja str
Mitä (ihmettä) ajattelet koodin tekevän? Kaksi eri tapaa käpistellä tiedostoja saa ohjelman toimimaan, vaikka siinä ei selkeästi ole tarvittua logiikkaa?
Nyt se toimii!! Kiitos kaikille oikeaan suuntaan ohjauksesta. =)
Aihe on jo aika vanha, joten et voi enää vastata siihen.