Datei Blockweise einlesen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Datei Blockweise einlesen

Beitrag von Inventio »

Hallo liebe Community,
ich möchte ein Programm schreiben, dass aus einer Datei Blockweise eine Frage ausliest und diese dann in meiner Maske darstellt und Auswertet. Mit einem "Block" meine Ich alle Zeilen, die eine Frage definieren, also die Fragen ID, die Frage selbst, Antwort 1, 2 und 3 und a,b oder c für die jeweils richtige Antwort.
So soll dann ein Fragenblock in der Datei aussehen:

Code: Alles auswählen

#1
Wieviel ist 1 + 1?
5
4
2
c
Jetzt habe ich mir überlegt, dass ich dazu am besten ein Record anlege. Dieses Record speichert einen Fragenblock. Über einen Array dieses Records kann ich dann viele Fragenblöcke einelsen und über den Index des Arrays jede einzelne Frage anwählen.
mein record sieht so aus:

Code: Alles auswählen

type
    Fragebogensammlung = record;
      ID : Integer;
      Frage : String;
      Ant1  : String;
      Ant2  : String;
      Ant3  : String;
      Correct : char;
  end
Das Array habe ich folgendermaßen deklariert:

Code: Alles auswählen

FragenIndex : Array of Fragebogensammlung;
Jetzt lese ich mit einer For-Schleife die ersten sechs Zeilen der Datei in ein Array of Strings und weise die jeweilige stelle des Arrays of Strings dem jeweiligen Attribut zu.
Das sieht dann folgendermaßen aus: (GespeicherteFragen ist ein Array of String)

Code: Alles auswählen

for i := 1 to 6 do
    begin
       readln(Fragebogen, GespeicherteFragen[i]);
    end;
    with Fragebogen[a] do
    begin
         ID := StrToInt(GespeicherteFragen[1]);
         Frage := GespeicherteFragen[2];
         Ant1 := GespeicherteFragen[3];
         Ant2 := GespeicherteFragen[4];
         Ant3 := GespeicherteFragen[5];
         Correct := GespeicherteFragen[6];
    end;
    inc(a);
Das Assign und den Rest habe ich mal rausgelassen, da das an dieser Stelle keine Rolle spielt. Meine Frage wäre jetzt, wie ich es am besten mache, dass dieser Teil der Funktion sooft aufegerufen wird, wie es Fragen in der Datei gibt, sodass is einen SIGSEGV error vermeide.
Am Ende möchte Ich auf FragenIndex[5] zugreifen können und die Frage Nummer 5 in meine Maske laden können (Oder eben jede andere Frage...).

Danke im Voraus: Inventio

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei Blockweise einlesen

Beitrag von theo »

Du kannst die Records direkt (Blockweise) schreiben und Lesen. Allerdings musst du dann eine fixe Stringgrösse verwenden (Shortstring).
Siehe z.B. hier http://www.lazarusforum.de/viewtopic.php?f=55&t=5923" onclick="window.open(this.href);return false;
Ich selber würde vllt. eher mit XML arbeiten.

Inventio
Beiträge: 39
Registriert: So 21. Mär 2010, 14:00

Re: Datei Blockweise einlesen

Beitrag von Inventio »

Ich habe leider keinerlei Erfahrung mit XML...
Ich verstehe nun, wie man ein Rekord in eine Datei schreibt, wie lese ich denn nun ein komplettes aus der Datei heraus?

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Datei Blockweise einlesen

Beitrag von theo »

Inventio hat geschrieben: Ich verstehe nun, wie man ein Rekord in eine Datei schreibt, wie lese ich denn nun ein komplettes aus der Datei heraus?
Googeln. Das ist Grundlagen-Pascal, die Suche muss nicht mal mit Lazarus oder Freepascal zu tun haben.

Antworten