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).
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...
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);
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);
Miks sulla on toi int tossa, eikös sen pitäisi olla "",ios::binary; ? Näistä en kyllä, sitten ole täysin varma...
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?
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...
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.