Læsning af komplekse data filer

Tags:    delphi

Hej. Jeg er just nu gået i gang med at lære om avanceret filhåndtering - jeg har (i hvert fald nogenlunde) styr på files of record, men der er i hvert fald en ting, jeg er usikker på der. Her er historien:

Jeg programmer utilities til brug i computerspillet Neverwinter Nights. Mit seneste projekt involverer læsning af diverse data filer, specielt ITP formatet (en programmør-gud, der desværre arbejder i C++, og hvis tutorials etc derfor ikke lige er til at bruge for mig, har lavet følgende beskrivelse af dette fil-format: http://www.torlack.com/index.html?topics=nwndata_itp )

Basically, der er en vis struktur i de her ITP filer (jeg overvejer dog om det er nemmere at lade som om, der ikke er...). Problemet er, at den ikke er ensartet. Nogle data elementer gemmes som, fx, longwords, andre som words, etc. etc. Jeg overvejede at lave en record med unions og så læse filen ind record for record. Men jeg har problemer med det her union concept. Jeg forstår fint nok:

myrecord = record
myname: string;
case something: boolean of
true: (trueint: longword);
false: (falseint: word);
end;

Men jeg er ikke helt sikker på, hvad jeg skal bruge det til. Jeg kan se, at jeg for hver læsning (med read) får en myrecord med et navn, men hvordan hulen læser den resten af record'en? Hvordan ved den, hvad something er?

Nå, jeg må hellere komme til spørgsmålene. Jeg mangler noget info om, hvordan jeg kan arbejde med den her slags data - er unions overhovedet vejen frem? Hvis ikke, skal jeg så læse filen som en untyped fil? Det kunne jeg godt bruge lidt hjælp med, så hvis nogen kender en god tutorial (gerne på nettet) vil jeg gerne høre om den.
Eller skal jeg bruge det her filestream, jeg er stødt på en del mens jeg har søgt efter svaret på det her? Det virker ret dårligt beskrevet, så hvis nogen kender til tutorials om det (eller vil give mig en lille forklaring) vil det også blive værdsat :)

Specielt ville jeg blive glad hvis en eller anden gad kigge på det link, jeg gav foroven omkring den her filtype, og så kunne give mig et skub i den rigtige retning ved at sige "Du skal bruge den her slags rutine til det her, og jeg kender den her artikel, der vil være rigtig god." Eller noget lignende :)

Tusind tak
Lilac Soul



3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
Nå, så her jeg en lille unit som kan læse det meste i en ITP fil.
Der mangler nogle enkelte typer (DATREF og CAPREF) men resten skulle være der.

Først kommer koden til unit'en og der efter en lille procedure som bruger den.

Fold kodeboks ind/udKode 



Og her er hvordan du bruger den:

Fold kodeboks ind/udKode 



Hvis du har nogle spørgsmål til unit'en så fyr løs :0)

God fornøjelse
Michael.



Hej. Jeg er just nu gået i gang med at lære om avanceret filhåndtering - jeg har (i hvert fald nogenlunde) styr på files of record, men der er i hvert fald en ting, jeg er usikker på der. Her er historien:

Jeg programmer utilities til brug i computerspillet Neverwinter Nights. Mit seneste projekt involverer læsning af diverse data filer, specielt ITP formatet (en programmør-gud, der desværre arbejder i C++, og hvis tutorials etc derfor ikke lige er til at bruge for mig, har lavet følgende beskrivelse af dette fil-format: http://www.torlack.com/index.html?topics=nwndata_itp )

Basically, der er en vis struktur i de her ITP filer (jeg overvejer dog om det er nemmere at lade som om, der ikke er...). Problemet er, at den ikke er ensartet. Nogle data elementer gemmes som, fx, longwords, andre som words, etc. etc. Jeg overvejede at lave en record med unions og så læse filen ind record for record. Men jeg har problemer med det her union concept. Jeg forstår fint nok:

myrecord = record
myname: string;
case something: boolean of
true: (trueint: longword);
false: (falseint: word);
end;

Men jeg er ikke helt sikker på, hvad jeg skal bruge det til. Jeg kan se, at jeg for hver læsning (med read) får en myrecord med et navn, men hvordan hulen læser den resten af record'en? Hvordan ved den, hvad something er?

Nå, jeg må hellere komme til spørgsmålene. Jeg mangler noget info om, hvordan jeg kan arbejde med den her slags data - er unions overhovedet vejen frem? Hvis ikke, skal jeg så læse filen som en untyped fil? Det kunne jeg godt bruge lidt hjælp med, så hvis nogen kender en god tutorial (gerne på nettet) vil jeg gerne høre om den.
Eller skal jeg bruge det her filestream, jeg er stødt på en del mens jeg har søgt efter svaret på det her? Det virker ret dårligt beskrevet, så hvis nogen kender til tutorials om det (eller vil give mig en lille forklaring) vil det også blive værdsat :)

Specielt ville jeg blive glad hvis en eller anden gad kigge på det link, jeg gav foroven omkring den her filtype, og så kunne give mig et skub i den rigtige retning ved at sige "Du skal bruge den her slags rutine til det her, og jeg kender den her artikel, der vil være rigtig god." Eller noget lignende :)

Tusind tak
Lilac Soul


Hej,

Har lige kigget på linket og som jeg ser det er det kun når der skal læses variabler at der kan opstå lidt problemer.

Her er en konvertering af "Element" strukturen:
PElement = ^TElement;
TElement = packed record
_Type : Cardinal;
NameIndex : Cardinal;
case Integer of
0: (ui8 : Byte);
1: (si8 : ShortInt);
2: (ui16 : Word);
3: (si16 : SmallInt);
4: (ui32 : Cardinal);
5: (si32 : Integer);
6: (flt : Single);
7: (Offset : Cardinal);
end;

Men som du nok også selv har læst dig frem til så er skal der mere til end bare en struktur for at læse de rigtige værdier (altså: strings, resource strings osv.).

Jeg vil gerne lave en konvertering af sourcen + structs så du kan komme i gang med at læse ITF formatet. Men det tager nok en dags tid inden jeg får tid....okay?
Jeg har selv NWN så jeg har filer at teste med.

Jeg mener ikke der bør være nødvendigt at bruge Streams, da hele filen sagtens kan læses ind i mem og der efter manipuleres.


Mvh
Michael.





[Redigeret d. 16/03-03 23:09:09 af Michael Skovslund]



t