AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Streams: existierende Daten entfernen / einfügen
Thema durchsuchen
Ansicht
Themen-Optionen

Streams: existierende Daten entfernen / einfügen

Offene Frage von "mytar"
Ein Thema von mytar · begonnen am 5. Aug 2004 · letzter Beitrag vom 29. Mär 2005
Antwort Antwort
Seite 1 von 2  1 2      
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#1

Streams: existierende Daten entfernen / einfügen

  Alt 5. Aug 2004, 11:42
Ich hantiere gerade bei Streams herum.
Nun tauchen bei mir folgende Probleme auf:
  • Wie entferne ich Daten aus einem Stream welcher auf existierende Daten zugreift?
  • Wie füge ich Daten in einen Stream ein, welcher auf existierende Daten zugreift?

mfg
mytar

[edit=sakura] [Klammern entfernt] Mfg, sakura[/edit]
Francis Obikwelu
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 5. Aug 2004, 17:44
Kann mir hier niemand weiterhelfen?

Hier nochmals:

Ich hab eine Datei, und öffne sie via Stream, nun möchte ich mit Seek() die entsprechende Position suchen, und dann was in den Stream einfügen, oder herauslöschen. Die Datei hab ich zuvor selbst erzeugt, ich kenne also die Dateistruktur.


mytar
Francis Obikwelu
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 5. Aug 2004, 17:50
Wenn du mitten reinschreiben willst, dann wird dir nichts anderes übrigbleiben, als ab der Stelle den Rest in einem memoryStream zwischenzuspeichern, deinen Datensatz reinschreiben und dann den gesicherten Rest wieder dranzuhängen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 5. Aug 2004, 17:53
Danke! Eine gute Lösung, ich bin natürlich nicht draufgekommen!

mytar
Francis Obikwelu
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#5

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 20. Aug 2004, 23:13
Aber wenn ich nach der Position suche und der Stream 4 MB groß ist, dauert das bei mir schon länger, ich glaube ich mach es nicht richtig:

Ich möchte ein Prog schreiben, was ein Bild und text in eine Datei speichert, erst soll es ein paar Memolines in den TFileStream schreiben und dann das Bild. Da der Text des Memos keine Begrenzung haben soll, würde ich beim Datei schreiben einfach ein '[END]' in den Stream schreiben.

Suchen würde ich das Ende des Memos/den Anfang des Bildes mit der folgenden Funktion (hab ich mir ausgedacht, aber sie ist so langsam. Wie sucht man nach einem "Wort" in einem Stream ("professionell")?)

Delphi-Quellcode:
//Aufruf
 Position := GetOffsetOf(FS, '[END]')-1;
 FS.Position

//Funktion
function GetOffsetOf(FS: TFileStream; S: String): Integer;
var
 C: Char;
 B, I: integer;
begin
 I := 0;
 Result := 0;
 While I < FS.Size-1 do begin
     FS.ReadBuffer(C, SizeOf(C));
     Inc(I);
     if UpCase(C) = UpCase(S[1]) then begin
        Result := I;
        for B := 2 to Length(S) do begin
            FS.ReadBuffer(C, SizeOf(C));
            Inc(I);
            if UpCase(C) <> UpCase(S[B]) then begin
               Result := 0;
               Break;
            end;
            if B = Length(S) then Exit;
        end;
     end;
 end;
end;
Also nochmal meine frage: Wie sucht man nach einer Zeichenfolge in einem Stream?

Danke schonmal!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 20. Aug 2004, 23:20
Zitat von F.W.:
Also nochmal meine frage: Wie sucht man nach einer Zeichenfolge in einem Stream?
Eine Variante:
Delphi-Quellcode:
var
  str: string[5];
.
.
.
Stream.Read(str, 5);
while str <> 'hallodo
  Stream.Seek(-4, soFromCurrent);
  Stream.Read(str, 5);
end;
Prinzip: Auf gut Glück einfach nen Block einlesen, und vergleichen. Wenn's nicht passt, dann Blockgröße-1 zurückspringen, und nochmals lesen... usw.usf.
Ist evtl. nicht so performant, aber anders hab ich das bisher auch noch nicht gemacht


gruss,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#7

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 20. Aug 2004, 23:41
Das ist ja schonmal ein Anfang.

Mir ist gerade was aufgefallen: Wenn ich jedes Zeichen einzeln schreibe (von 'Hallo') wird die Datei 5 Bytes groß und es steht richtig "Hallo" drin (wenn man sie mit HexEditor öffnet). Mach ich es mit
Delphi-Quellcode:
 S := 'Hallo';
 WriteBuffer(S, SizeOf(S));
Dann ist die Datei nurnoch 4 Bytes groß und mit HE kann man Hallo nicht lesen.
Ich habs aber noch nicht geschafft das wieder richtig herzustellen, darum meine (2.) Frage: Für das Beispiel "Hallo" -> Wie schreibt und ließt man richtig in und aus Streams?

[Edit]@dizzy: Wieso um 4 zurück? Da könntest du doch was verpassen, einmal liest du bsw. 'lo...' und nach dem zurückspringen '..Hal'!? (Wenn ich das richtig sehe).[/Edit]
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 20. Aug 2004, 23:46
Moin!

S ist ein AnsiString und daher nur ein Zeiger auf den String. Daher ergibt SizeOf() auch eine 4, weil es ein Pointer ist. Somit folgendes:

1. Nutze anstatt SizeOf() die Funktion Length() um die Länge des Strings zu ermitteln.
2. Gebe der Schreibroutine das erste Zeichen an.

Delphi-Quellcode:
 S := 'Hallo';
 WriteBuffer(S[1], Length(S));
MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#9

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 21. Aug 2004, 01:34
Das funktioniert!

Stelle fest: Auslesen funktioniert dann folgender Maßen
Delphi-Quellcode:
const
 L: Integer = 5; //Länge
var
 S: Array[0..MAX_PATH-1] of Char;
//oder S: Array[0..L-1] of Char;
 FS: TFileStream;
    { ... }
 FS.ReadBuffer(S, L);

Soweit hätten wirs damit schonmal
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#10

Re: [Streams]: existierende Daten entfernen / einfügen

  Alt 23. Aug 2004, 19:11
Da gibt's doch noch was besseres (meine Methode geht zwar auch, aber das hab ich in nem Tut gelesen):

Delphi-Quellcode:
var
 S: String;
begin
   { ... }
 SetLength(S, Len);
 FS.ReadBuffer(S[1], Len);
   { ... }
end;
Soviel dazu!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz