C Binärbaum von Dateien einlesen?

MrSyniXDriVe

Lt. Junior Grade
Registriert
Aug. 2013
Beiträge
308
Hallo zusammen!
Mit eine Kollegen müssen wir fürs Studium was programmieren. Gleich vorweg, ich erwarte hier keinen Code den ich per Copy-Paste reinkopieren kann, sondern einfach ein paar Ansätze oder Lösungswege.

Wir müssen ein "Textadventure" erstellen. Das Bedeutet, es gibt eine Start.txt. In dieser Textdatei steht ein Titel, 2 Verweise auf andere .txt Dateien (Möglichkeit A und B) und die Geschichte.
Der Spieler soll sich nun für A oder B entscheiden. Je nach Entscheidung wird nun der Text der jeweiligen Auswahlmöglichkeit angezeigt (der wiederum in einer neuen .txt gespeichert ist).

Facts:
Die Inhalte ALLER .txt Dateien müssen bei Programmstart eingelesen werden, also nicht erst wenn die Auswahl getroffen wurde.
Es gibt eine unbekannte Anzahl an Textdateien, nur der Name der ersten Datei ist bekannt, da er mit Kommandozeilenparameter beim Programmstart übergeben wird.
Auch die Anzahl der Zeilenlängen von Titel etc ist unbekannt.
Daher muss mit dynamischen Speicher gearbeitet werden
Es dürfen nur die Standard-C-Libraries verwendet werden.


Das ich für das Beispiel einen Binärbaum brauchen werde ist mir klar:

Code:
struct Baum
{
char *titel;
char *text;
struct Baum *option_A;
struct Baum *option_B;
}

Für die erste Datei haben wir mit fseek() und ftell() die größe der Datei festgestellt und anschließend einen buffer mit malloc auf diese größe angefordert.
Anschließend haben wir mit einer Schleife einfach Character für Character in den buffer eingelesen.
Vielleicht gibts da ja noch eine bessere Möglichkeit (ist aber nicht primäres ziel)

Wir stehen eigentlich vor einem ganz anderen Problem:
Wir haben keinen Plan wie wir die einzelnen Zeilen un den Struct einlesen sollen, geschweige denn, wie wird das als Binärbaum durchlaufen lassen bis alle Dateien eingelesen wurden, da ja für die erste Datei zwei weitere eingelesen werden müssen, anschließend für diese 2 Dateien wieder 4 weitere etc bis das Ende des Baumes erreicht wurde.


Hier noch ein Beispiel für so eine Textdatei:

Dies ist der Titel der Geschichte
Kapitel2_auswahlA.txt
kapitel2_auswahlB.txt
Dies ist der Text der Geschichte. Er kann über mehrere Zeilen gehen.
Bitte wähle eine Möglichkeit: A oder B?

Der User gibt dann A oder B als Imput ein und das Programm fährt fort, das sollte aber das kleinste Problem darstellen. Wenn die Möglichkeiten zu ende sind, steht bei den .txt Dateien nur ein "-\n" drinnen.

Ich hoffe ihr versteht das Problem und könnt weiterhelfen :).
 
Etwas in dieser Richtung:
Code:
function readBaum(file: string): Baum {
  const fileText = readFile(file);

  const parser = /regexOderWasAuchImmer/;
  const parsed = parser.parse(fileText);

  const title = parsed['title'];
  const text = parsed['text'];
  const optionAFile = parsed['optionAFile'];
  const optionBFile = parsed['optionBFile'];

  const optionA = readBaum(optionAFile);
  const optionB = readBaum(optionBFile);

  const baum = new Baum(title, text, optionA, optionB);
  return baum;
}

Rekursion ist das Stichwort.
 
Zuletzt bearbeitet:
Hi,

ich würde mir die Lösung selber überlegen und programmieren. Beim Abgabegespräch wirst du sonst Probleme haben deine Denkweise zu erklären.

Für allgemeine Fragen steht dir selbstverständlich die Newsgroup zur Verfügung.

Die Wahrscheinlichkeit auf ein Plagiat wird übrigens auch größer wenn man eine Teillösung online findet.

Die Angabe zum Problem ist übrigens hier zu finden, falls es doch jemanden interessiert.

mit besten Grüßen
 
@ MrSyniXDriVe
Wie Bagbag schon sagte, solche Geschichten macht man eigentlich immer mit Rekursion.

Ihr könnt ja bereits die start.txt einlesen. Ich schätze, ihr macht das ungefähr so:

1. Erzeuge eine leere Struct.
2. Lese die Datei.
3. Schreibe das Zeug aus der Datei in die Struct.

Genau das wollen wir nun immer und immer wieder wiederholen lassen, bis es nichts mehr einzulesen gibt. Stellt euch vor, ihr schreibt eine Funktion, die ungefähr so aussieht:

Code:
function void readFileIntoNode(File f, Node n) {

    // öffne f
    // lese schnickschnack aus f
    // schreibe schnickschnack aus f nach n
    // mach f wieder zu
    
    if (n ist eine sackgasse) {
        return;
    }
    
    n.o1 = new Node(); // Du machst eine neue Node für Option 1
    n.o2 = new Node(); // Du machst eine neue Node für Option 2
    
    // hier passiert nun gleich die Magie!
    readFileIntoNode(option1Datei, n.o1);
    readFileIntoNode(option2Datei, n.o2);

}

Das ist der Kerngedanke von Rekursion. Wiederhole etwas so lange, bis die Abbruchbedingung (in diesem Fall eine Sackgasse) erreicht wird.

Der Baum würde also zuerst komplett den Ast aufbauen, der immer nach Option 1 geht. Sobald eine Sackgasse gefunden ist, würde Option 2 des vorherigen Astes weitergegangen werden, und so weiter und so weiter, bis der gesamte Baum fertig gebaut wurde.

Schau dir das an und verinnerliche es! Du wirst das immer wieder benötigen, wenn du mit dem Programmieren weitermachen willst.

@ ESP Tutor
Als ehemaliger Informatik Student muss ich den Threadersteller verteidigen.
Es wurde nicht nach einer Lösung gefragt, sondern eher um Techniken gebeten, eine bestimmte Art von Problem anzupacken. Ich glaube jeder von uns eingefleischten Programmieren kann sich an einige Situationen in der Vergangenheit erinnern, in denen uns eine spezielle Technik vorgestellt wurde und wir am liebsten Halleluja geschriehen hätten, weil wir plötzlich ein sehr elegantes neues Werkzeug in unser Repertoire aufnehmen konnten.
Wenn das in diesem Fall für den TE die Rekursion ist, dann sei es so. Es ist immer etwas anderes, in einer Vorlesung ein Thema vorgestellt zu bekommen und es auf der anderen Seite praktisch anzuwenden.
 
Zuletzt bearbeitet:
Hii @Killkrog

Hab mir jz extra einen Account gemacht um DANKE zu sagen :)
Ich hab die letzten tage verzweifelt versucht die rekursion hinzubekommen (wie auch @MrSyniXDriVe) und bin die letzten stunden schon sehr verzweifelt.

Ich wusste ich habe alle Bausteine zusammen, nur konnte ich sie einfach nicht richtig anordnen - und mit deiner einfachen übersicht hats nun innerhalb von 15min geklappt

VIELEN DANK für deine Hilfe :cool_alt:
 
Zurück
Oben