AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Datei einlesen / bearbeiten / speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Datei einlesen / bearbeiten / speichern

Ein Thema von der_don · begonnen am 23. Mär 2005 · letzter Beitrag vom 23. Mär 2005
Antwort Antwort
der_don

Registriert seit: 22. Mär 2005
8 Beiträge
 
#1

Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 10:46
Hi

bin neu in diesem Forum, daher weiss ich nicht genau wo ich diesen Thread hinschreiben soll.
Naja. Ich hab ein Problem mit dem auslesen einer Datei (nicht txt)!

In dieser Datei stehen die Daten in Hex Code, d.h. wenn ich die Datei z.B. mit dem Editor öffne seh ich Sonderzeichen etc. Mit dem Hexeditor kann ich die Datei lesen. Nun zu meinem Problem.

Ich möchte diese Datei auslesen (mit TFileStream oder so) und nach einem bestimmten String suchen und diesen umschreiben. Nun habe ich da ein kleines Problem. Und zwar:

Wenn ich die Datei ohne weiteres auslese und in ein Memo anzeigen lasse ist nach dem 5. Zeichen Schluss. Im Hexeditor ist das 5. Zeichen "00" ... Wenn ich das aus der Datei entferne arbeitet mein Programm so wie ich es will und muckt nicht rum.

Kann es wirklich nur an "00" liegen ? Später in dieser Datei taucht "00" bestimmt noch 50 mal auf und das Programm stoppt dort nicht ....

Ich bin kurz vorm verzweifeln...

Kann mir jemand helfen und mir sagen, wie ich die komplette Datei (nicht *.txt), also jedes Zeichen, auslesen kann und in nem Stream speichern kann?!?!?

mfg don
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#2

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 12:01
Hallo,

das könnte Dir weiter helfen:
Tutorial Streams von Delphi-Source.de
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
der_don

Registriert seit: 22. Mär 2005
8 Beiträge
 
#3

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 12:44
naja so richtig hilft das auch nicht. Möchte das Zeug ja nicht in einem Array speichen... Gibts da keine anderen Möglichkeiten/Links/etc... ?
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 12:52
Herzlich willkommen!

Das habe wurde mir hier einmal auf ein ähnliches Problem hin geantwortet, wenn ich den Autor finde, editiere ich den Beitrag, noch.

Evtl. geht es damit:

Delphi-Quellcode:
function TForm1.ScanFileForString(aFile, SearchString: String; IgnoreCase: Boolean=true;
                           MaxBytesScanned: Int64 = 2097152): Boolean;
const
  MAX_BUFFER_SIZE = 20480; //20 kb
var
  Buffer: String;
  FS: TFileStream;
  BytesRead: Integer;
  i, match: Integer;
  BufferSize, StrLength: Integer;
begin
  Result := false;

  If (SearchString = '') then exit;
  If IgnoreCase then SearchString := ANSIUppercase(SearchString);

  //Datei öffnen... falls das nicht klappt gibts hier ne Exception
  //daher die Funktion besser im try..except Schutzblock aufrufen!
  FS := TFileStream.Create(aFile, fmOpenRead or fmShareDenyWrite);

  try
    BufferSize := 0;
    StrLength := Length(SearchString);
    //Ermitteln wie groß der Puffer sein muss. Er soll ca. 20 kb groß sein,
    //wenn nicht die ganze Datei reinpasst
    If FS.Size <= MAX_BUFFER_SIZE then
      BufferSize := FS.Size else
        BufferSize := (MAX_BUFFER_SIZE div StrLength) * StrLength;
    SetLength(Buffer, BufferSize);

    Repeat //Höchstens MaxBytesScanned Bytes untersuchen oder bis EOF
      BytesRead := FS.Read(Buffer[1], BufferSize);
      If BytesRead = 0 then exit;
      If IgnoreCase then Buffer := ANSIUppercase(Buffer);

      for i:=1 to BytesRead do
      begin
        if Abbruch then exit;
        Application.ProcessMessages;

        match := 0;
        If (BufferSize-(i-1) >= StrLength) then
          while (Buffer[i+match] = SearchString[match+1]) do
          begin
            if Abbruch then exit;
            Application.ProcessMessages;

            inc(match);
            If match = StrLength then
            begin
              Result := true;
              //exit;
            end;
          end;
      end;

    Until (FS.Position >= MaxBytesScanned) or (FS.Position = FS.Size);
  finally
    FS.Free;
    SetLength(Buffer, 0);
  end;
end;
Nachtrag: Den Code hat Dani damals hier gepostet.
  Mit Zitat antworten Zitat
der_don

Registriert seit: 22. Mär 2005
8 Beiträge
 
#5

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 13:21
Danke für die Antwort Matze!
Aber ich brauche glaube etwas mehr als nur die Funktion, da ich ein Anfänger in Delphi bin
Ein Bischen Erklärungen zu einzelnen Sachen wäre nicht schlecht, da ich es ja auch verstehen muss sonst Frage ich beim nächsten mal wieder
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 13:36
Hai der_don,

kommt der String nur einmal in der Datei vor? Und ist der String mit dem er ersetzt werden soll genau so lange?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
der_don

Registriert seit: 22. Mär 2005
8 Beiträge
 
#7

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 13:39
ja der gesuchte String kommt nur einmal vor und er soll durch einen String ersetzt werden, welcher genauso lang ist ...
  Mit Zitat antworten Zitat
Ferber

Registriert seit: 9. Mär 2005
Ort: Wien Umgebung
155 Beiträge
 
Delphi 2006 Architect
 
#8

Re: Datei einlesen / bearbeiten / speichern

  Alt 23. Mär 2005, 15:03
Hi, Das sollte funktionieren.
Delphi-Quellcode:
function ReplaceString(InFileName, OutFileName, SearchString, ReplaceString:String):Integer;
var
  s:TMemoryStream;
  p:PChar;
begin
  Result := 0;
  If (SearchString = '') then exit;
  if Length(SearchString)<>Length(ReplaceString) then exit;
  s:=TMemoryStream.Create;
  try
    s.LoadFromFile(InFileName);
    Result:=Pos(SearchString, String(s.Memory));
    if Result>0 then
       begin
         p:=PChar(ReplaceString);
         Move(p^, Pointer(Integer(s.Memory)+Result-1)^,Length(SearchString));
       end;
    s.SaveToFile(OutFileName);
  finally
    s.Free;
  end;
end;
Gruss, Otto
Otto
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:40 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