Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 13:18

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: textdatei auslesen..
BeitragVerfasst: Mi Aug 13, 2008 14:58 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
is ne n00bische frage, mit sicherheit.
aber ich hab bisher sonst keine genaue antwort gefunden, weil genau die frage für mich relevant is, nirgends so direkt gestellt wird oder so o,o

also ich will ne art online-rollenspiel basteln, mit nem kumpel zusammen.
dazu möchte ich leicht zugängliche tabellen machen (weil die meisten mitspieler einfach keine hacker sein werdn, bzw bei leichteren sachen schon aufgeben).
also textdateien, die dann mapdaten, monsterdaten, spawndaten etc beinhalten.

ich nehm mal an, beim laden von sowas stopf ich die datei in ne string-variable?

zb
Code:
  1. map : string;
  2.  
  3. [...]
  4.  
  5. map:='\txt\map.txt';


aber da beginnts:
1. wie stell ich das am saubersten an, dass er die datei ausliest.
2. wie kann ich ihm sagen, er soll nur zeile nr sowieso lesen?

ich würd das dann mit repeat-until machen, dass er liest und zeilenweise bearbeitet bis er in ner neuen zeile auf 'end." o.ä. stößt.

thx im voraus, des wär ganz hilfreich.

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2008 15:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
http://www.delphi-treff.de/tutorials/datenspeicherung/
www.google.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 13, 2008 17:01 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bestes suchwort:

Textdateien zeilenweise lesen
Textdateien zeilenweise schreiben

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2008 18:00 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
mkay und wenn ich ressourcen schonen will..

also ich will die textdatei für die map-daten eig tabellarisch machen, quasi je zeile und zeichendoppel stehn fürn bestimmten x/y-wert

quasi
Code:
  1. 00 10 20 30 40 50
  2. 01 11 21 31 41 51
  3. 02 12 22 32 42 52
  4. 03 13 23 33 43 53
  5. 04 14 24 34 44 54
  6. 05 15 25 35 45 55
nur, dass dann an der jeweiligen position bild und kollisionsdaten oder so stehen.
wie kann ich nur n bestimmtes zeichen auslesen?
oder muss ich dann die richtige zeile auslesen, alle doppel als einzelne variablen auslesen (sind halt viele, weil somit ganze mapbreite) und dann nur die nötigen paar nehmen? (also die, deren tile-kacheln dann angezeigt werdn/im bild sind o,o)

sone tabellarische txt ist halt der einfachste weg, der mir einfällt, um mapdaten sinnvoll zu speichern.
oder kann ich irgendwie als .bmp mit farben für bestimmte bodenarten nehmen und der kann die einzelnen pixel lesen?

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Aug 15, 2008 20:58 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Graustufenbitmap wäre sicher eine nette Idee, kann man dann nett in nem Grafikprogramm malen die Levels. :)
Zu dem Textformat:
Entweder du fügst dir noch eine Art Headerzeile ein
5 10
-> Das Level ist 5 Einheiten hoch und 10 breit
oder du gehst die Datei zweimal durch:
Einmal, um Breite und Höhe zu ermitteln und dann ein entsprechendes 2D-Array zu erstellen, was alle Elemente fasst.
Dann gehst du wieder Zeile für Zeile durch und die jeweils aktuelle Zeile splittest du bei den Spaces und packst das mit StrToInt in den entsprechenden Platz im Array. Nicht wild und eigentlich ziemliches Grundlagenprogrammieren, ich weiß jetzt nicht genau, ob das Forum hier der richtige Platz für dich mit dieser Frage ist. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 16, 2008 11:34 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
jo, son splitten mit den leerzeichen dachte ich auch schon..
wie würde denn die sache mit der graustufenbitmap aussehen?
jeder x/y-wert hat dann n byte von 0 bis 255, das hieße, ich darf nur 256 arten von boden machen xD
wie kann ich denn 1 pixel auslesen? (die möglichkeit 1 bild im ram zu halten und immer mal wieder anzuschaun erscheint mir kürzer als riesige textmengen auszulesen und zuzuordnen)

und nyoah.. ich hatte delphi in der schule und da ist nicht alles wissen + man vergißt was.. das projekt dient ja dazu mein wissen jetzt aufzufrischen und anzuwenden, also mehrere denkansätze immer durchzugehn o,o
joah, ob ich mit dem thread ins anfängerforumdings gehör, ist mod-sache ^^

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2008 16:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
also eine Textdatei auszulesen um non-text-daten ins Programm zu bekommen ist meiner Meinung nach eine bescheuerte Idee, weil man für die Daten in textform mehr Speicher raußschmeißt, als wenn man sie Binär speichert. An deiner Stelle würde ich das so machen, dass ich eine Datei erstelle, in der an erster Stelle die Länge und Breite deines Spielfeldes als integer gespeichert sind und anschließend einfach das Array mit einer for-schleife hinterher schreiben. Datei schließen und fertig.
Zum Auslesen macht man das ganze dann in gleicher Reihenfolge nur in die andere Richtung. man liest die ersten beiden Werte als Integer ein und erstellt ein 2dArray mit diesen Größen. danach lässt man eine for-schleife den rest der datei einlesen und speichert das in die Arrayfelder.
Das geht schnell und spart Platz. Ich glaube eine nützliche Sache wonach man mal schauen sollte sind in der hinsicht TFileStream. ist zwar die langsamste Methode Dateien einzulesen und zu schreiben, aber meistens werden mit TFileStream auch noch nützliche alternativ Methoden vorgestellt.

Der wichtigste Vorteil an Binärdateien ist der, dass man nicht mit string delimitern erstmal den eingelesenen Krempel auseinander wurschtelm muss, weil eh alles schon in angenehmen Häppchen serviert ist. Ich hab das früher auch mal so gemacht, weil ich dachte, dass Textdateien ja so schnell zu bearbeiten sind. hatte dann aber nach kürzester Zeit und kleinstem Funktionsumfang bereits bergeweise unverständlichen Code und hab alles nach 3 Tagen weg geschmissen und war frustriert, weil mein ach so toller Einfall ein Reinfall war. Danach umgestiegen auf Binärfiles (es sei denn es geht wirklich um Text) und bin damit zufrieden.

Falls es tatsächlich um Bearbeitungskomfort geht, solltest du auch nicht auf Textfiles setzen, sondern lieber nen kleinen Editor für deine Dateien schreiben. Delphi bietet ja genügend Komponenten für sowas.

grüße!

EDIT:: bei Filestreams funktioniert das speichern mit write und read befehlen (merkwürdig wie logisch das klingt). Da braucht man zwei parameter für, einmal Die Herkunft/das Ziel der Daten und als zweiten parameter die größe der Daten in byte. am einfachsten ist es dann als zweiten Parameter "sizeof(meinVariablenTyp)" zu verwenden. Das klappt mit einzelnen Variablen, Arrays und Records hervorragend. Das heißt also, dass du auch zusammengehörige Daten in Blöcken schreiben kannst, so dass alle Eigenschafften eines Feldes beieinander liegen und direkt im richtigen Format in deine Variablen gespeichert werden, ohne dass du noch irgendwelche Daten-zerschnibbel-aktionen brauchst.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2008 16:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bei Streams sollte man zum Schreiben TWriter und zum Lesen TReader nutzen, die erlauben über einfache Funktionen auch das Schreiben und Lesen von Strings und machen Zugriffe auf solche Streams viel einfacher als wenn man selbst direkt in den Puffer schreibt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Aug 19, 2008 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bei Binärdateien hat man aber immer einige Nachteile. Erstens muss man gegen mehr oder weniger ungewollte veränderungen gewappnet sein. Z.B. könnte jemand mittels überschreiben einer Stringlänge eine AV oder einen OutOfMemory produzieren. Zumindest letzterer ist nicht mehr so schön.
Dann muss man beachten, dass man von jeder Dateiversion auf eine nächste (also nach jeder änderung im Dateiformat, in der Anordnung und der Art der Daten) einen Converter schreiben oder Rückwärtskompatibilität bieten muss. Beides ist eine sehr nervige Prozedur.
Nicht zu vergessen ist, dass man seine Binärdateien eindeutig kennzeichnen sollte ("Magic Number" am Anfang oder ähnliches) und ihnen Versionsnummern geben, damit man weiss, welche Version man vor sich hat. Binärdaten lesen, die nicht zum eigenen Programm gehören können unanagenehme Ergebnisse produzieren, meistens AccessViolation oder OutOfMemory.

Allerdings muss ich zugeben, dass für Maps Binärdateien wegen der art und menge der Daten meist das sinnvollste ist. XML sorgt hier für viel zu viel code drumherum, Ini ist nicht das wahre, Reintext hatten wir gerade. Dennoch wollte ich auf die Probleme hinweisen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 20, 2008 19:38 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
was ist dann mit inifiles?
ich hatte jetzt n tut für die gefunden (okay, is auch echt einfach). wann sind die sinnvoll?
ich mein, die sind doch auch textdateien?

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 21, 2008 11:06 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ich würde XML Dateien empfehlen.
Diese mögen zwar grösser als Textdateien sein (wegen struktur) sind aber von jedem sterblichen änderbar.

Bilder würd ich als Bilder belassen und nur mit der XML datei darauf referenzieren.

Betreffend XML findet man im Wikipedia bzw Google ziemlich viel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 21, 2008 14:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
ecth hat geschrieben:
was ist dann mit inifiles?
ich hatte jetzt n tut für die gefunden (okay, is auch echt einfach). wann sind die sinnvoll?
ich mein, die sind doch auch textdateien?


Ja, aber sie sind sehr einfach zu handhaben und für mehr oder weniger einfache konfigurationsinformationen klasse. Für Maps natürlich wie gesagt alles andere als zu gebrauchen.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 17:15 
Offline
DGL Member

Registriert: So Jun 01, 2008 16:06
Beiträge: 31
Wohnort: Nürtingen
Uff, ich komme erst jetzt dazu hier weiterzumachen. Kein lobenswertes Tempo .__.

Ich schau mir jetzt verschiedene Lösungsmöglichkeiten an. Aber müsste es nicht eigentlich egal sein, was ich nehme, wenn man bedenkt, dass ich nur 1 Map habe und diese zu Beginn lade. D.h. es wäre stark unelegant aber an sich nicht weiter hinderlich, wenn ich die Map von vornherein sonst wo auslese und von dort an als 2D-array parat halte?

Oder wie würdet ihr eine Map gestalten?

Ich habe hier zwar genug gelesen, aber da bleibts nunmal ein Randomfeld und kein Auslesen aus einer Quelle.

Wenn ich die Map als Binärdatei hätte, würde ich die nötigen Tiles immer dort auslesen oder würde ich sie trotzdem in den Arbeitsspeicher schießen?

_________________
blub.. ? oo''


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Der Zugriff auf den Arbeitsspeicher ist deutlich schneller als auf Dateien. Also solltest du, solange es Speicherverbrauchmäßig (also nicht gerade 500MB oder so) verantwortbar ist, das ganze im Arbeitsspeicher halten.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 09, 2009 19:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
Almost everything is possible.
And as said if the map fits into memory that is faster.

Reading your map can be done using tstrings. And as a bonus tstrings know how to read from a file.
after tstrings has read your file you can go trough it line by line.
Now a line contains 00 01 00 01 etc. So you have to break that up. E.g. read the line into a TStringList and then set the separator to a comma.
So you now can access each element.

Now it is time to think how to store this efficiently into memory ...

Also if you want to access a specific part in the file you can do that using a tfilestream.
But you have to calculate the offset.
E.g. if you have 10 elements in row and each element is 2bytes large.
ANd you want to acess the the 3rd element on the fourth line
you have to move the position in the filestream to (4*10*2) + (2*2). And then do a read.

_________________
http://3das.noeska.com - create adventure games without programming


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 35 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]