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
Zeichen in Stream zurückschreiben
Re: Zeichen in Stream zurückschreiben
Stream.Seek(-1, soFromCurrent);
Stream.Write...
Oder versteh ich dich falsch?
Stream.Write...
Oder versteh ich dich falsch?
Re: Zeichen in Stream zurückschreiben
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:
Gruß,
Oliver
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;
Oliver
Re: Zeichen in Stream zurückschreiben
OK, wenn's funzt...
Mein Beispiel oben war für die Klasse TStream, resp. TFileStream gedacht.
Mein Beispiel oben war für die Klasse TStream, resp. TFileStream gedacht.
-
- 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
get/put/unget/... ist eine FIFO-Funktionalität: ein Lese- und ein separater Schreib-Pointer werden verwaltet.)dl1yov hat geschrieben:wie das in C mit der Funktion "ungetc"
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