Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Määrän ja arvojen haku tiedostosta

Sivun loppuun

mika132 [27.12.2010 17:16:01]

#

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

Teuro [27.12.2010 18:25:00]

#

Lue vaikka rivi kerrallaan ja katso onko id haettu ja jos on, niin tallenna taulukkoon. Lukemiseen olet minusta saanut valmiin koodin hetki sitten.

mika132 [28.12.2010 02:06:44]

#

Kyllä, mutta miten sitä koodia voi toistaa rivi kerrallaan ettei tuo hae aina samalta riviltä?

-tossu- [28.12.2010 10:54:49]

#

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.

Metabolix [28.12.2010 13:49:28]

#

-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"

-tossu- [28.12.2010 14:09:19]

#

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.

eq [29.12.2010 09:47:35]

#

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++.

Metabolix [29.12.2010 15:05:09]

#

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.

mika132 [30.12.2010 00:58:03]

#

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.

eq [30.12.2010 08:31:09]

#

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?

mika132 [30.12.2010 17:46:19]

#

Nyt se toimii!! Kiitos kaikille oikeaan suuntaan ohjauksesta. =)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta