Zeichen in Stream zurückschreiben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
dl1yov
Beiträge: 6
Registriert: Di 28. Okt 2008, 18:13

Zeichen in Stream zurückschreiben

Beitrag von dl1yov »

Hallo,

ich habe folgendes Problem:

In einer Schleife lese ich mit "read" einzelne Zeichen aus einem Stream. Nach Beendigung der Schleife möchte ich gern das letzte Zeichen wieder in den Stream zurückschreiben, wie das in C mit der Funktion "ungetc" möglich ist. Wie stelle ich das am besten an?

Gruß,

Oliver

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

Re: Zeichen in Stream zurückschreiben

Beitrag von theo »

Stream.Seek(-1, soFromCurrent);
Stream.Write...

Oder versteh ich dich falsch?

dl1yov
Beiträge: 6
Registriert: Di 28. Okt 2008, 18:13

Re: Zeichen in Stream zurückschreiben

Beitrag von dl1yov »

Das Problem ist gelöst: Der Hauptfehler war, daß der Dateityp lediglich als "File" definiert war, ich habe das geändert in "File of char". Dann kann man auch problemlos die "seek"-Funktion verwenden. Also ungefähr so:

Code: Alles auswählen

 
var fp: File of char;
     c: char;
 
FileName := paramstr(1);
	if (FileExists(FileName) = true) then  begin
		Assign(fp, FileName);
		Reset(fp); 
  		lineno := 1;
 
              ...
 
              read (fp,c);
 
              ....
 
             seek(fp,filepos(fp)-1);
 
            ...
 
 	       Close(fp);
...
end;
 
 
Gruß,

Oliver

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

Re: Zeichen in Stream zurückschreiben

Beitrag von theo »

OK, wenn's funzt...
Mein Beispiel oben war für die Klasse TStream, resp. TFileStream gedacht.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Zeichen in Stream zurückschreiben

Beitrag von mschnell »

dl1yov hat geschrieben:wie das in C mit der Funktion "ungetc"
get/put/unget/... ist eine FIFO-Funktionalität: ein Lese- und ein separater Schreib-Pointer werden verwaltet.)
TStream arbeiet eher wie ein Datei-Handle: ein einziger Schreib/Lese-Pointer.

Das kann man kaum vergleichen. Ein TStream ist nicht gut als FiFo zu gebrauchen.

Ich habe vor einiger Zeit eine - glaube ich - recht effektive Implementierung von get/put/unget/... in Object-Pascal programmiert. Wenn Du den Souce-Code sehen möchtest, kann ich ihn uploaden.

-Michael

Antworten