Dateizugriff mit Pascal

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Dateizugriff mit Pascal

Beitrag von dosuser60 »

Hi Leute!

Beim Ändern eines meiner Programme bin ich auf ein Problem gestoßen.

Ich habe mir eine Struktur für einen Datensatz erstellt:

Code: Alles auswählen

Type dbase = record
name : string[30];
ort : string[30];
end;
und eine Datei mit dieser Struktur definiert. Wenn ich nun diese Datei mit Assign verknüpfe und mit ReWrite öffne, kann ich einen Datensatz ohne Probleme einfügen. Da das Ganze aber eine Datenbank ist, kann man sich denken, dass man die Datenbank nicht mit jedem neuen Datensatz auch komplett neu schreiben möchte. Das Problem ließe sich ja lösen, indem man ReWrite durch Append ersetzt. Das funktioniert bei mir bloß nicht, denn wenn ich das Programm mit Append ausführen will, kommt immer "Error 63: Invalid File Type". Könnte mir da jemand helfen?
MfG

Marcel (dosuser60)
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Dateizugriff mit Pascal

Beitrag von wobo »

Append funktioniert nur mit typisierten ASCII-Textdateien, und natürlich nur, wenn das Textfile schon angelegt ist.

z.B.:

Code: Alles auswählen

type  dbase = record
	  name : string[30];
	  ort : string[30]; 
	end;

var	Mydbase : dbase;

procedure DranHaengen( Einfg : dbase );
var datei: text;
begin
    assign( datei, 'MyText.txt' );
    append( datei );                    {Datei muss schon exisitieren!}
    writeln( datei, Einfg.name );
    writeln( datei, Einfg.ort );
    close( datei );
end;

begin
    Mydbase.name := 'dosuser60';
    Mydbase.ort     := 'Husum';
    Dranhaengen( Mydbase );
end.
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Re: Dateizugriff mit Pascal

Beitrag von dosuser60 »

Hi wobo,

erstmal danke für die Antwort.

An soetwas ähnliches hatte ich auch schon gedacht, allerdings bin ich da dann am Auslesen gescheitert, da ich ja zwei Daten (=ein Datensatz) pro Zeile habe, welche durch ein Leerzeichen getrennt sind. Bei C++ liest der cin-Befehl immer nur bis zum nächsten Leerzeichen. Gibt es denn so eine ähnliche Funktion auch bei Pascal oder, um auf dein Beispiel zurückzukommen, eine Möglichkeit ganze Zeilen einzulesen?
MfG

Marcel (dosuser60)
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Dateizugriff mit Pascal

Beitrag von wobo »

dosuser60 hat geschrieben:Hi wobo,

erstmal danke für die Antwort.

An soetwas ähnliches hatte ich auch schon gedacht, allerdings bin ich da dann am Auslesen gescheitert, da ich ja zwei Daten (=ein Datensatz) pro Zeile habe, welche durch ein Leerzeichen getrennt sind. Bei C++ liest der cin-Befehl immer nur bis zum nächsten Leerzeichen. Gibt es denn so eine ähnliche Funktion auch bei Pascal oder, um auf dein Beispiel zurückzukommen, eine Möglichkeit ganze Zeilen einzulesen?
Deswegen hatte ich in meinem Beispiel auch die einzelnen Einträge über zwei Zeilen verteilt. Denn nein, so eine Funktion gibt es in Pascal nicht.

Man kann sie aber einfach basteln, so z.B.:

Code: Alles auswählen

procedure ReadFirstEntry;
var datei : text;
      TrennPos ; byte;
      zeile : string;
begin
    assign( datei, ´dbase.txt' );
    reset( datei );
    readln( datei, zeile );
    TrennPos := Pos(' ',zeile);
    Mydbase.name := Copy( zeile, 1, TrennPos-1 );
    Mydbase.ort := Copy( zeile, TrennPos+1, Length(zeile)-TrennPos );
    close( datei );
end;

Die Daten mußt Du dann natürlich entsprechend formatiert, d.h. mit dem Trennzeichen ' ' (Leerzeichen), in das Textfile eintragen,
z.B..

Code: Alles auswählen

 ...
 writeln( datei, Mydbase.name, ' ', Mydbase.ort );
 ...
Brueggi

Re: Dateizugriff mit Pascal

Beitrag von Brueggi »

Habs jetzt nur überflogen... ich hoffe die Antwort passt.
Die Datei sollte mit Assign(var,'dateiname'); Reset(var,1); geöffnet werden oder mit Reset(var,satzlänge) - dann kann man mit Seek(var,position); den Satz wählen, der gelesen/geschrieben werden soll. Bis zum Leerschritt lesen könnte man theor. selbst machen - mal liest einfach Zeichenweise aus einer Datei und vergleicht bis Chr(32).
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Re: Dateizugriff mit Pascal

Beitrag von dosuser60 »

Vielen Dank für eure Hilfe! Ich überlege mir nochmal, welche Methode ich wähle. Soweit hätte sich das Thema damit erledigt.
MfG

Marcel (dosuser60)
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Re: Dateizugriff mit Pascal

Beitrag von dosuser60 »

Wie man sich irren kann!

Bei dem Versuch die Datei als Textdatei zu verknüpfen, kommt "Error 24: File components may not be files or objects". Ich frage mich, wie es zu dieser Fehlermeldung kommt, wo doch nichts falsch definiert ist. Auch die Übersetzung der Fehlermeldung bringt nicht wirklich Klarheit, denn es heisst, dass Dateikomponenten keine Dateien oder Objekte sein können. Weiß da jemand vielleicht einen Ausweg?
MfG

Marcel (dosuser60)
Brueggi

Re: Dateizugriff mit Pascal

Beitrag von Brueggi »

Keine Ahnung auf was Du dich jetzt beziehst, aber auf meine Antwort bezogen lautet es:

var blabla: FILE;
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Re: Dateizugriff mit Pascal

Beitrag von dosuser60 »

Um das Ganze zu konkretisieren:

Ich wollte meine Datenbankdatei als Textdatei einbinden aber beim Versuch kam die Fehlermeldung raus und ich weiß nicht, was sie zu bedeuten hat.
MfG

Marcel (dosuser60)
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Dateizugriff mit Pascal

Beitrag von wobo »

dosuser60 hat geschrieben:Um das Ganze zu konkretisieren:

Ich wollte meine Datenbankdatei als Textdatei einbinden aber beim Versuch kam die Fehlermeldung raus und ich weiß nicht, was sie zu bedeuten hat.
Mir geht es gerade wie Brueggi: Ich kann mit Deinen Infos nicht so richtig was anfangen. Poste doch am besten die Source-Zeile, in der der Fehler auftritt.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Dateizugriff mit Pascal

Beitrag von freecrac »

Stören Leerzeichen, oder fehlt eine Pfadangabe?

Dirk
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Re: Dateizugriff mit Pascal

Beitrag von dosuser60 »

Also der Fehler tritt in folgender Zeile auf:

Code: Alles auswählen

Append(dfile);
Obwohl ich dfile vernünftig definiert habe:

Code: Alles auswählen

dfile : File of Text;
Hoffe das hilft jetzt.
MfG

Marcel (dosuser60)
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Dateizugriff mit Pascal

Beitrag von wobo »

dosuser60 hat geschrieben:Also der Fehler tritt in folgender Zeile auf:

Code: Alles auswählen

Append(dfile);
Obwohl ich dfile vernünftig definiert habe:

Code: Alles auswählen

dfile : File of Text;
1. Die Fehlermeldung wird nicht in der Zeile "Append(dfile)" ausgegeben, sondern bereits in der Zeile zur Variablendeklaration, denn ein "File of Text" gibt es nicht.
2. Textdateien werden als "dfile : Text" deklariert, siehe meine obigen Beispiele.

[zu 1. und 2.: zumindest unter TP 7.0]
dosuser60
MemMaker-Benutzer
Beiträge: 76
Registriert: Fr 16. Sep 2011, 16:33
Wohnort: Husum

Re: Dateizugriff mit Pascal

Beitrag von dosuser60 »

Danke!

Hat endlich geklappt. Der Fehler lag tatsächlich in der Definitionszeile für die Dateivariable.

Das Programm funktioniert nun so wie es soll und das Thema hat sich diesmal endgültig erledigt (Diesmal wird es keine Ausnahme geben).

@wobo: Der Fehler lag tatsächlich in der Append-Zeile, aber wegen der falschen Definition.
MfG

Marcel (dosuser60)
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Dateizugriff mit Pascal

Beitrag von wobo »

dosuser60 hat geschrieben: @wobo: Der Fehler lag tatsächlich in der Append-Zeile, aber wegen der falschen Definition.
Ich glaube Dir das gerne. Bei meinem Versuch Deinen Fehler zu reproduzieren kam allerdings bei mir (Turbo Pscal 7.0) die Fehlermeldung in der Deklarationszeile. Ich kann mich aber vage daran erinnern, dass sich verschiedene Compilerversionen bei solchen Dingen unterschieden haben. Zumindest bei TP 5.5 kamen nicht alle Fehlermeldungen dort, wo sie dann auch bei TP 7.0 erfolgten (vage Erinnerung an die frühen 90er). Vielleicht liegt es auch an unterschiedlichen Compilerschaltern? Egal, Hauptsache es klappt jetzt! ;-)
Antworten