Avatar billede emileej Nybegynder
09. april 2002 - 09:56 Der er 13 kommentarer og
4 løsninger

Læsning + skrivning til filer i C++ stil...

Jeg skal gemme en del data i en fil, og senere hente den (sjovt nok).
Jeg skal ikke gemme ren tekst, men både strings, inegers, og enkelte chars... Jeg kender rækkefølgen, dataerne kommer i, så jeg behøver ikke at gemme hvilken type data der følger. Derimod gemmer jeg længden på mine strings før jeg gemmer selve string'en...
Eksempel:
[int][int][strlen][str][int][char][strlen][str]
Comprende?
At gemme dataen er en smal sag, men når jeg skal hente dem igen - hvordan henter jeg så f.eks. en enkelt integer fra filen?

E-)mil
http://mfp.eej.dk
Avatar billede jakoba Nybegynder
09. april 2002 - 10:15 #1
Du kommer nok til at gemme moget struktur-information sammen med dine data. I det format du beskriver kan jeg for eksempel ikke finde nogen måde at hitte ud af om det tal der står som det næste i strengen er et tal der er gemt eller længden på en streng der følger bagefter.

en nem måde at gøre det er at vedtage et 'skilletegn' der så sættes imellem de enkelte værdier. fx tegnet | (lodret streg)

"123|456|8 hej emil|234.789"
så kan du bagefter dele strenge op i stumper alle de steder der står et | tegn, og hvis der sår noget efter det tal der altid er forrest i stumpen så er tallet en strenglængde og resten er strengen.

Java har et begreb "serialize" som du måske kan bruge her til at pakke og udpakke dine data, prøv at læse lidt om det.

mvh JakobA
Avatar billede greybeard Nybegynder
09. april 2002 - 12:12 #2
Hvis du kender rækkefælgen på dine data, og har længden på dine strenge, kan du læse én byte ad gangen, og samle dem bagefter.
Men du skal vide, hvad du gør. F.eks. består en char af to bytes, der skal behandles sådan: (char)(highByte * 256 + lowbyte).
det vil nok kræve lidt eksperimenteren at få det til at virke.
Avatar billede greybeard Nybegynder
09. april 2002 - 12:17 #3
Imidlertid er det nok nemmere at lave et containerbojekt til dine data, og så bruge ObjektOutputStream hhv. ObjektInputStream.

Så kan du gemme og hente alle data i objektet i et hug.
Avatar billede disky Nybegynder
09. april 2002 - 12:30 #4
At begynde og bruge | som token er en besværlig måde at gøre det på.

Specielt når Java har en IO stream der hedder DataOuputStream som netop kan skrive byte,string, float osv direkte til fil.

Skal det være rigtigt fint bruger du Serialize istedet.
Avatar billede emileej Nybegynder
09. april 2002 - 17:13 #5
Jeg ville i C++ gøre som graybeard forslår i sit første indlæg, og så bruge sizeof, men da java ikke leverer en void pointer, men en char, er jeg ikke helt klar over hvordan jeg går fra en splittet char til en int... Desuden har jeg ikke fundet en erstatning for sizeof i java...

Jeg vil undgå:                  Fordi:

At bruge '|' som seperator      Det er unødvendigt, da jeg ved hvad der er hvor i filen, og derfor optager det unødvendigt ekstra plads.

At hente hele filen            Det optager unødvendigt meget ram. Det er mere ram - venligt at smidde dataen ud hvor den skal, efterhånden som den kommer ind.

Please help! Mit program skal afleveres fredag...

E-)mil
http://mfp.eej.dk
Avatar billede greybeard Nybegynder
09. april 2002 - 18:19 #6
I java har du i modsætning til C++ standarder for variable størrelser.
Så hvis du vil have lænfden på en String, må du kunne bruge myString.length og så gange med to for at få størrelsen i bytes.
Ellers prøv myString.toByteArray() og find længden her.

For at komme fra byte til char, skal du gange den ene byte med 256 og lææge den anden til.
Jeg ved ikke hvilken der bliver gemt først, men det kan en test vel vise.
Iøvrigt skal du indlæse dine bytes som int. eller får du negative værdier.
Avatar billede emileej Nybegynder
09. april 2002 - 18:37 #7
misforståelse!
mit eneste problem:
at læse en integeger fra filen - herunder at finde størrelsen (som du siger er fast) på integer'en og konvertere de læste bytes fra char til integer (read returnerer char []).
Jeg sidder på arbejde lige nu, og har derfor ikke mulighed for at teste noget, men jeg går da ud fra at man ikke bare kan type caste fra char[] til int...

E-)mil
http://mfp.eej.dk
Avatar billede disky Nybegynder
09. april 2002 - 18:45 #8
emileej:

Brug DataInputStream, den gør det for dig.
Avatar billede emileej Nybegynder
09. april 2002 - 19:55 #9
>>disky
Kigger på det når jeg får fri :)
Avatar billede emileej Nybegynder
10. april 2002 - 08:12 #10
Jeg har kigget på klassen, og det er helt klart den jeg skal bruge, men constructoren tager en InputStream som argument, og jeg har kun et File object - hvad så nu? Ku du ikke smide et eksempel på oprettelse af en DataInputStream på grundlag af et File object?

E-)mil
http://mfp.eej.dk
Avatar billede emileej Nybegynder
10. april 2002 - 22:14 #11
Pleeease! Anyone?
Avatar billede carstenknudsen Nybegynder
11. april 2002 - 13:33 #12
Fra et File objekt file instantierer du
new FileInputStream( file )
der nedarver fra InputStream.
Avatar billede emileej Nybegynder
11. april 2002 - 14:22 #13
Ahh - tester med det samme! :D
Avatar billede emileej Nybegynder
29. august 2002 - 00:20 #14
Doh! Sorry!
Jeg fik testet det og jeg havde succes. Har snart brugt det længe.
Undskyld forsinkelsen - det er totalt uacceptabelt.

E-)mil
Avatar billede disky Nybegynder
29. august 2002 - 06:44 #15
det er bare helt okay, jeg forstår dog ikke hvorfor du nok har accepteret den dårligste løsning. Nemlig at kode det selv, java har nogle geniale java.io.* klasser som gør alt det for dig.

Men okay hvorfor gøre det nemt når det kan være besværligt.
Avatar billede emileej Nybegynder
29. august 2002 - 08:50 #16
Jeg må så tilstå at jeg ikke rigtigt læste svarene igår
- var vist ikke heelt vågen. Jeg bruger DataInputStream :)

E-)mil
Avatar billede disky Nybegynder
29. august 2002 - 09:09 #17
hehe :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester