Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tiedostoon tallentaminen binäärimuodossa

Sivun loppuun

d-hunter [25.06.2008 00:54:02]

#

Moi,

Olen tässä yrittänyt saada ohjelmaani tallentamaan lukua binäärimuodossa tiedostoon. Ohjelma kääntyy kiltisti ja sen voi ajaa siihen pisteeseen asti, kun tavaraa oltaisiin tallentamassa.

Tässä vaiheessa ohjelma (MS Visual Studio 2008) antaa seuraavanlaisen virheen ja ohjelman suoritus pysähtyy:

VC++ kirjoitti:

Unhandled exception at 0x6b497868 in ohjelmannimi.exe: 0xC0000005: Access violation reading location 0x00000009.

Koodissa tallennuspätkä on seuraavanlainen:

int Tallennus(int kulunut)
{
	int avausliput = ios_base::binary;
	ofstream tulos("tallenne.dat", avausliput);
	if (!tulos.is_open()){
		return 0;
	}else{
		tulos.write((char *)kulunut,sizeof kulunut);
		tulos.close();
		return 1;
	}
}

Tietoa yritetään luonnollisesti tallentaa Tallenna (int-tyyppinen muuttuja).

vehkis91 [25.06.2008 01:03:12]

#

Jos pistät tuon "ios_base::binary" tilalle ios::binary, voisi toimia, mutta en kyllä ole varma... Ja kannattaa varmaan laittaa se ios suoraan siihen ofstreamin perään...

d-hunter [25.06.2008 01:08:05]

#

lainaus:

Unhandled exception at 0x6af37868 in ohjelmannimi.exe: 0xC0000005: Access violation reading location 0x0000000c.

Ja rivi on nyt näin:

ofstream tulos("tallenne.dat", (int)ios::binary);

Anthaing [25.06.2008 01:09:59]

#

write()-funktiolle pitäisi välittää osoite, mutta välität sille kulunut-muuttujan arvon muunnettuna char*-osoittimeksi. Luulen, että kulunut-muuttujan arvo on 9. Miten olisi:

tulos.write((char *)&kulunut,sizeof kulunut);

vehkis91 [25.06.2008 01:11:37]

#

Miks sulla on toi int tossa, eikös sen pitäisi olla "",ios::binary; ? Näistä en kyllä, sitten ole täysin varma...

d-hunter [25.06.2008 01:12:42]

#

Anthaing kirjoitti:

write()-funktiolle pitäisi välittää osoite, mutta välität sille kulunut-muuttujan arvon muunnettuna char*-osoittimeksi. Luulen, että kulunut-muuttujan arvo on 9. Miten olisi:

tulos.write((char *)&kulunut,sizeof kulunut);

Ratkaisi ongelman, kiitos. Luki näköjään kirjassakin, mutta sen siitä saa kun väsyneenä vääntää.

lainaus:

Miks sulla on toi int tossa, eikös sen pitäisi olla "",ios::binary; ? Näistä en kyllä, sitten ole täysin varma...

Eikös tuo int-muotoista palauta?

vehkis91 [25.06.2008 01:15:56]

#

Saattaapi olla, mutta en ole lukenut vähään aikaan mitään nykyaikaista ohjelmointi-kirjaa, joten en ole ihan varma miten nykyaikana noi tiedoston käsittelyt tehdään oikeaoppisesti...

map_ [25.06.2008 13:39:02]

#

ios::binary:n tietotyyppi, mikä sitten onkaan, on sellainen, että sen voi antaa suoraan ofstreamille. int-muunnosta ei tarvita, ja periaatteessa se saattaa jopa olla "väärin", mikäli oikea tietotyyppi sattuu olemaan vaikkapa long.

teksturi [25.06.2008 23:06:25]

#

Itse käyttäisin mielummin tuossa funktiossa boolia, koska se selkeyttäisi, että palauttaa onnistuiko vai ei. Jos päätät käyttää boolia niin käytä mielummin true ja false käskyjä numeroiden sijaan.


Sivun alkuun

Vastaus

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

Tietoa sivustosta