PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie Datei aufbauen?



dubov
04-09-2001, 18:58
Hallo zusammen

Eine Warnung gleich vorneweg: ich bin Anfänger in der C-Programmierung und Einsteiger in Linux.

Ich möchte für mich ein kleines Wörterlernprogramm schreiben. Das Programm läuft auf der Konsole und die Bildschirmsteuerung erfolgt durch die curses-Library.
Mein Programm soll die Daten aus einer Datei auslesen.

Nun mein Problem: Wie soll ich die Datei aufbauen?
Was dabei beachtet werden sollte?

1. Die Datei sollte Informationen über ihren Inhalt, Sprache und etc. enthalten.

2. Die Daten sollten in zufälliger Reihenfolge eingelesen werden können.

3. Die Datei sollte erweiterbar sein. Z.B. zu einem Wort später noch ein Alternativwort hinzufügen zu können und trotzdem sollte das Programm ohne grössere Änderungen damit zurecht kommen.


Vielen Dank für eure Hilfe.

gruss dubov

redhead
05-09-2001, 11:34
DEN richtigen Weg fuer Dein Problem gibt es nicht, solche Desingfragen sind jedes mal anders zu loesen und auch eine Frage des persoenlichen Stils. Ich wuerde mir zuerst eine structure definieren, in der alle Informationen gespeichert sind, auf die Du wert legst. Wenn Du eine gefunden hast mit der Du zufrieden bist, musst Du diese Struktur nur noch in eine Datei schreiben.

Daten in zufaelliger Reihenfolge auslesen halte ich fuer nicht so sinnvoll, denn c benutzt streams. D.h.: Eine Datei ist ein Datenstrom von Zeichen, die nacheinander ausgelesen werden koennen. Dies bei jedem Zugriff aufs neue zu machen ist irgendwie umstaendlich. Stattdessen bietet es sich an die Daten in einzelne Lektionen zu unterteilen und diese Lektionen am Stueck einzulesen. Dann kannst Du mit den (eingelesenen) Daten Zufallszugriffe machen ohne jedes mal ganze Dateien zu durchforsten. Speicheralloziierung waehrend der Laufzeit ist ja in c moeglich.

Just my 0.02$, redhead

jgbauman
06-09-2001, 02:42
Ich schaetze das Projekt soll dazu dienen C zu lernen. Daher wird dir mein erster Rat nicht passen:
Nimm fuer so ein kleines, feines Programm nicht C, sondern Perl/Tcl/Python/Java. Damit kommst Du schneller und einfacher ans Ziel.

Aber wahrscheinlich willst Du es trotzdem weiter mit C versuchen.
Tja, Dateiformat: Da stellt sich erst mal meist die grundlegende Frage: binaer oder ASCII? Binaere Dateiformate sind unter umstaenden leichter zu parsen, ASCII-Dateien sind ausserhalb des eigentlichen Programms leichter zu handhaben, vi/emacs genuegt.

redhead hat wahrscheinlich recht, wenn er sagt erst alles in den Speicher lesen, dann zufaellige Auswahl (obwohl dank lseek/fseek es nicht noetig ist).

Wie werden die Daten erzeugt. Von Hand? Auch mit deinem Programm? Aus freien Quellen (z.B.
ftp://ftp.leo.org/pub/comp/doc/dict/ )?

Soll dein Programm die Daten nur lesen und nicht evtl. veraendert zurueckschreiben?

Soll das Programm Statistik fueren uber deine (Fehl-)Eingaben?

Ich wuerde zu ASCII-Datein raten, da die einfacher zu erweitern sind.

Einfach zu parsen, aber manuell schlecht zu bearbeiten ist folgendes: Anzahl Daten.
Man schreibt immer vor den Daten, wieviel Daten da jetzt kommen. Das ganze kann man auch noch verschachteln, z.B.:

Anzahl_Vokabel
Vokablen
...

und jede Vokabel ist wieder:
Anzahl_Woerter_Sprache_1
Woerter
...
Anzahl_Woerter_Sprache_2
Woerter
...

z.B.:
2 1 bit 2 Biss bit 2 to walk 1 gehen

Allerdings sowas von hand zu bearbeiten ist kein Spass.

Ansonsten muss man sich mit speziellen Formatierungszeichen behelfen.
z.B.

#Sprache1
English
#Sprache2
Deutsch
#Lektion
Beispiel
#Author
jgbauman
#Vokabeln
bit -- Biss, bit
to walk -- gehen
#Ende

So eine Datei kann man zeilenweise lesen [fgets() ] und man weiss dann immer was kommt, bzw. bei den Vokabeln liest man halt bis die Zeile #Ende kommt.
Die Vokabel-Zeilen kann man dann ja einfach am "--" in eine linke und eine rechte Haelfte teilen [z.B. strstr()]. Allerdings weiss man hier nicht im voraus wieviel Vokablen kommen.
Man muss also eine obere Grenze einbauen oder sich mit dynamischer Speicherverwaltungbeschaeftigen (malloc, realloc, free).


Ist man zu faul den Parser komplett selber zu schreiben kann man sich sog. Parsergeneratoren bedienen (lex/yacc bzw flex/bison, etc). Die sind aber nicht unbedingt einfach zu bedienen.

Eine technisch elegante Loesung (und der Hype schlechthin ;-) waere XML ( http://www.w3.org/XML/ ). Mit Hilfe von expat oder libxml2 waere das Parsen einfach, das Dateiformat koennte sehr flexibel ausfallen.
Das leidige Speicherverwaltungsproblem kann man mit zusaetzlichen Bibliotheken etwas umgehen. z.B. glib ( www.gtk.org (http://www.gtk.org) ) fuer C oder die STL fuer C++ bieten huebsche Containerobjekte die einem da viel Arbeit abnehmen koennen.

Ich hoffe das war jetzt halbwegs verstaendlich, viel Spass beim implementiern ;-)