AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi SCHNELL: Erste 100 Zeichen aus Textdatei lesen
Thema durchsuchen
Ansicht
Themen-Optionen

SCHNELL: Erste 100 Zeichen aus Textdatei lesen

Ein Thema von PeterPanino · begonnen am 23. Okt 2012 · letzter Beitrag vom 25. Okt 2012
Antwort Antwort
Seite 2 von 3     12 3      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 24. Okt 2012, 19:05
Weiters würde ich dir wärmstens davon abraten, jedesmal in der Funktion Speicher für das dynamische Array zu allozieren (SetLength(); was eig. eh dann, sobald es außer Scope fällt (Funktionsende), dealloziert wird).
Lös das bitte anders!
Wie würdest du das lösen? Den Speicher außerhalb der Funktion allozieren?

Edit: Ich seh grad, dass du auch ein Kopiervorgang drinnen hast (Result := String(Buffer))
Ist imho auch unnötig und sehr ineffizient.
Ich brauche ja das Funktionsergebnis als string. Wie soll man sonst einen string als Funktionsergebnis erhalten?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#12

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 24. Okt 2012, 19:29
Ohne Kopieren in Zwischenpuffer:
Delphi-Quellcode:
function GetStartBlockFromTextFile(const F: string; const X: Integer): AnsiString;
// holt die ersten X Zeichen aus der Text-Datei F
var
  SR : TStreamReader;
  len : Integer;
begin
  SR := TStreamReader.Create(F);
  try
    SetLength(Result, X);
    len := SR.ReadBlock(Result, 0, X);
    // evtl. in len < X, dann wird der String entsprechend verkürzt
    SetLength(Result, len);
  finally
    SR.Free;
  end;
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#13

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 24. Okt 2012, 23:07
Wie würdest du das lösen? Den Speicher außerhalb der Funktion allozieren?
Kommt ganz drauf an, was du mit den 100 Bytes bezwecken willst.. Ein Beispiel wäre das hier
Delphi-Quellcode:
// die funktion liefert die erste datei, bei der die ersten 100 stellen aus Nullen bestehen, zurück
function searchForEmpty100(const Filenames: Array of AnsiString): Integer;
var
  iFile : Integer;
  Buffer : AnsiString;
  hFile : THandle;
  Bytes : Cardinal;
const
  BUFSIZE = 100;
begin
  SetLength(Buffer, BUFSIZE); // einmaliges Allozieren
  for iFile := 0 to High(Filenames) do
  begin
    hFile := CreateFileA(pAnsiChar(Filenames[iFile]), GENERIC_READ, FILE_SHARE_READ, NIL,
      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // jede datei öffnen
    if hFile <> INVALID_HANDLE_VALUE then
      try
        ReadFile(hFile, Buffer[1], BUFSIZE, Bytes, NIL);
        if BUFSIZE = Bytes then
        begin // genau 100 zeichen konnten eingelesen werden
          if check_100bytes(buffer) then
          begin
            Result := iFile;
            break;
          end;
        end;
      finally
        CloseHandle(hFile); // und wieder schließen, sofern geöffnet
      end;
  end;
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 24. Okt 2012, 23:32
Ohne Kopieren in Zwischenpuffer:
Delphi-Quellcode:
function GetStartBlockFromTextFile(const F: string; const X: Integer): AnsiString;
// holt die ersten X Zeichen aus der Text-Datei F
var
  SR : TStreamReader;
  len : Integer;
begin
  SR := TStreamReader.Create(F);
  try
    SetLength(Result, X);
    len := SR.ReadBlock(Result, 0, X);
    // evtl. in len < X, dann wird der String entsprechend verkürzt
    SetLength(Result, len);
  finally
    SR.Free;
  end;
end;
Das lässt der Compiler nicht zu, da ReadBlock im ersten Parameter ein Char-Array erwartet, Result aber als AnsiString deklariert ist. Wie kann man das type-casten?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 24. Okt 2012, 23:39
Wie kann man das type-casten?
Casten garnicht.



z.B. Delphi-Referenz durchsuchenTEncoding

Oder, wenn die internen Daten bitkompatibel sind, dann "kopieren" (Move)
$2B or not $2B
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 24. Okt 2012, 23:54
Ich erkenne leider nicht, wie man in dem obigen Beispiel mit TEncoding einen AnsiString in ein Char-Array umwandeln kann. Es geht ja darum, dass ReadBlock ein Char-Array erwartet, als Parameter aber nur ein AnsiString zur Verfügung steht.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#17

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 25. Okt 2012, 00:11
Hast du dir meine Variante angeschaut?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#18

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 25. Okt 2012, 00:12
was Shima meinte war wohl

len := SR.ReadBlock(@Result[1], 0, X); Ich hatte eine identische Antwort fertig, habe sie aber nicht abgeschickt, da es bei mir nicht zuverlässig zum laufen kam, war abhängig vom Encoding der Datei und seltsamerweise auch vom Inhalt, irgendetwas an TStreamreader ist da etwas Voodoo.
Willst Du einen Binärvergleich fahren oder geht es nur um Textdateien (in einheitlicher Codierung) ?
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 25. Okt 2012, 00:39
was Shima meinte war wohl

len := SR.ReadBlock(@Result[1], 0, X); Ich hatte eine identische Antwort fertig, habe sie aber nicht abgeschickt, da es bei mir nicht zuverlässig zum laufen kam, war abhängig vom Encoding der Datei und seltsamerweise auch vom Inhalt, irgendetwas an TStreamreader ist da etwas Voodoo.
Willst Du einen Binärvergleich fahren oder geht es nur um Textdateien (in einheitlicher Codierung) ?
Es geht nur um Textdateien, aber das Encoding kann je nach Anwendersystem wohl unterschiedlich sein. Ich werde mich deshalb nicht mit TStreamReader Voodoo herumschlagen, sondern mal die Variante von Aphton ausprobieren. Vielen Dank!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#20

AW: SCHNELL: Erste 100 Zeichen aus Textdatei lesen

  Alt 25. Okt 2012, 13:04
OK Leute...

OLD SCHOOL

Delphi-Quellcode:
Procedure Schnell;
Var
  Buffer : array[0..99] of byte;
  F : file;
  gelesen : Integer;
begin
  AssignFile(F,'Cool.txt');
  reset(F,1);
  Blockread(F,Buffer[0]),100,gelesen);
  Closefile(F);
  if gelesen = 100 then
   begin
     bla;
   end;
end;
Würde sagen NIX ist schneller!

Mavarik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 07:25 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