AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TTextStream - Textdateien einlesen
Thema durchsuchen
Ansicht
Themen-Optionen

TTextStream - Textdateien einlesen

Ein Thema von himitsu · begonnen am 19. Mai 2010 · letzter Beitrag vom 4. Nov 2011
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

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

AW: TTextStream - Textdateien einlesen

  Alt 17. Aug 2010, 13:07
Joar, da hatte ich wohl ein bissl zuviel gelöscht.

1. sollte jetzt funktionieren.
(die Prüfung wurde ausversehn mit entfernt)

2. joar, das war hier eigentlich nicht vorgesehn
(in meiner größeren Version gibt es dafür eine interne Option ... hab dafür aber nun einen neuen Access-Wert eingeführt > saWriteWithoutBOM)


#$FEFF ist das "Zeichen" für Unicode ... wenn man dieses Zeichen entsprechend kodiert, dann ergibt dieses das BOM der zugehörigen Kodierung.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: TTextStream - Textdateien einlesen

  Alt 17. Aug 2010, 13:47
Hallo,

erstmal TOP

Hab beim Überfliegen gerade gesehen, dass sich u.U. ein Copy&Paste-Fehler eingeschlichen hat. In Zeile 287-289 von Class Function TEncoding.GetASCII: TEncoding; wird FBigEndianUnicodeEncoding verwendet anstatt wahrscheinlich FASCIIEncoding .

Ist aber nur eine Vermutung.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
273 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TTextStream - Textdateien einlesen

  Alt 17. Aug 2010, 13:54
Hallo Himitsu,

vielen Dank für die schnelle Antwort und Änderung! Respekt!

Allerdings hat sich glaube ich da noch ein kleiner Fehler eingeschlichen. Mir wurden jetzt bei UTF8-ohne-Bom-Dateien auch die drei ersten Zeichen abgeschnitten.
Ich habe dann die Zeile 638 von
If (FBufferSize < i)... auf
If (FBufferSize >= i)... geändert und jetzt scheint alles korrekt zu funktionieren.

Vielen Dank nochmal!

Gruß

Freejay
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TTextStream - Textdateien einlesen

  Alt 17. Aug 2010, 14:01
@Freejay: If (FBufferSize < i) or not CompareMem(@FByteBuffer[0], @B[0], i) Then i := 0; wäre richtiger.
(hab beim Umdrehen des äußeren IFs das AND vergessen mitzudrehen )

@ChrisE: ich seh nix
danke




Hatte dieses
Delphi-Quellcode:
If not Assigned(FEncoding) Then Begin
  i := TEncoding.GetBufferEncoding(FByteBuffer, FEncoding);
  If i > 0 Then Begin
    Move(FByteBuffer[i], FByteBuffer[0], FBufferSize - i);
    Dec(FBufferSize, i);
  End;
End Else Begin
  B := Encoding.GetPreamble;
  i := Length(B);
  If (FBufferSize >= i) and CompareMem(@FByteBuffer[0], @B[0], i) Then Begin
    Move(FByteBuffer[i], FByteBuffer[0], FBufferSize - i);
    Dec(FBufferSize, i);
  End;
End;
auf jenes
Delphi-Quellcode:
If Assigned(FEncoding) Then Begin
  B := Encoding.GetPreamble;
  i := Length(B);
  If (FBufferSize < i) or not CompareMem(@FByteBuffer[0], @B[0], i) Then i := 0;
End Else i := TEncoding.GetBufferEncoding(FByteBuffer, FEncoding);
If i > 0 Then Begin
  Move(FByteBuffer[i], FByteBuffer[0], FBufferSize - i);
  Dec(FBufferSize, i);
End;
gekürzt.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Aug 2010 um 14:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TStringStreamEx - Textdateien einlesen

  Alt 20. Mai 2010, 18:29
Zitat von p80286:
Ihr kommt auf Ideen, solche Perversitäten,
*rrrrrrrr*

Manchmal sind die alten Pascal-Funktionen eigentlich recht praktisch.
Nur schade ist, daß man damit nur ANSI-Text-Dateien erstellen und auslesen kann
und das interne Caching ist nicht unbedingt .... nja, ich wie soll man es denn nennen? ... optimal?

Hiermit könnte man sogar eine normale TStringList effektiver füllen. Zumindestens was größere Dateien angeht, dann so ab einer 300 MB-Textdatei bekommt man schonmal ein OutOfMemory, da ja alles am Stück eingelesen und verarbeite wird, also wärend des LoadFrom... und SaveTo....
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TTextStream - Textdateien einlesen

  Alt 21. Mai 2010, 08:56
[info] nicht wundern ... es gibt jetzt nur noch eine Version für Unicode (D2009/2010) und die anderen Delphis.

Nja, und ein paar vergessene Codezeilen wurden noch schnell integriert ... die Erkennung der Zeilenumbrüche (siehe [edit] in #1).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

Re: TTextStream - Textdateien einlesen

  Alt 21. Mai 2010, 11:32
Fein gemacht!

Ein Verbesserungsvorschlag für Zeile 707: Else Mode := fmOpenReadWrite or fmShareDenyWrite or fmCreate; Ohne dem dem fmCreate machts bei neuen Dateien einfach nur buuuuuuum.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TTextStream - Textdateien einlesen

  Alt 21. Mai 2010, 12:09
Ups, also für Zeile 706+707 dann Dieses:
Delphi-Quellcode:
If Access = saRead Then Mode := fmOpenRead or fmShareDenyWrite
Else If Access = saAppend Then Mode := fmOpenReadWrite or fmShareDenyWrite
Else Mode := fmCreate or fmOpenReadWrite or fmShareDenyWrite;
Im Testcode lese ich über einen Stream ein und schreibe auch darüber. Und dort wird über CreateFile + einen speziellen THandleStream gearbeitet ... da ist dieser CodeTeil wohl etwas zukurzgeraten, beim Test.


Hier knallt's nicht, aber es ist schon blöd, daß man dem TFileStream nicht weitere Attribute mitgeben kann (vorallem FILE_FLAG_RANDOM_ACCESS und FILE_FLAG_SEQUENTIAL_SCAN geb ich ja gerne mal an, um Windows ein bissl unter die Arme zu greifen)
Delphi-Quellcode:
Case Mode of
  fmReadWrite: Begin
                  A := GENERIC_READ or GENERIC_WRITE;
                  C := OPEN_EXISTING;
                End;
  fmCreate: Begin
                  A := GENERIC_READ or GENERIC_WRITE;
                  C := CREATE_NEW;
                  Mode := fmReadWrite;
                End;
  fmCreateOrRW: Begin
                  A := GENERIC_READ or GENERIC_WRITE;
                  C := OPEN_ALWAYS;
                  Mode := fmReadWrite;
                End;
  Else Begin
                  A := GENERIC_READ;
                  C := OPEN_EXISTING;
                End;
End;
H := CreateFile(PChar(Filename), A, FILE_SHARE_READ, nil, C,
  FILE_FLAG_RANDOM_ACCESS or FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, 0);
If H = INVALID_HANDLE_VALUE Then
  Raise EFCreateError.CreateResFmt(@SFCreateErrorEx,
    [ExpandFileName(Filename), SysErrorMessage(GetLastError)]);
AssignToStream(THandleStream2.Create(H), True, Mode = fmReadOnly, Encoding);
Mal sehn, vielleich verbau ich noch 'ne Abwandlung davon in diesem Code.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#9

Re: TTextStream - Textdateien einlesen

  Alt 21. Mai 2010, 13:02
Dann habe ich noch ein Problem ... beim Flush im Destructor eines schreibenden (logisch ) TTextStreams kommt eine Zugriffverletzung an der Stelle FByteBuffer := FEncoding.GetBytes(FStringBuffer); in der Funktion "WideCharToMultiByte".

Ich gebe zu, dafür kannst du wahrscheinlich nicht direkt was, aber falls dir eine Lösung einfällt, würde ich mich freuen.

Das hier funktioniert nicht:
Delphi-Quellcode:
procedure TForm30.FormCreate(Sender: TObject);
var
  tt : TTextStream;
begin
  tt := TTextStream.Create('f:\test.txt', saWrite);
  tt.WriteLine(DateTimeToStr(Now));
  tt.Free;

end;
Das gleiche in einer ConsolenApp geht [edit]auch nicht[/edit].
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: TTextStream - Textdateien einlesen

  Alt 21. Mai 2010, 13:20
Oh, da hat sich noch ein Fehler bei der Pufferumstellung eingeschlichen
(früher Byte-Array mit 0-Index und jetzt String mit der bösen 1, aber die anderen Codestellen sehen diesbezüglich OK aus )

Zeile 811
Code:
[b]Procedure[/b] TTextStream.WritePart(Const S: SString);
  [b]Begin[/b]
    ...
      Move(S[1], FStringBuffer[FBufferSize[color=#ff0000][b] + 1[/b][/color]], Length(S) * SizeOf(Char));
und Zeile 836
Code:
[b]Procedure[/b] TTextStream.Flush;
  [b]Begin[/b]
    [b]If[/b] FAccess <> saRead [b]Then Begin[/b]
      FByteBuffer := FEncoding.GetBytes([color=#ff0000][b]Copy([/b][/color]FStringBuffer[color=#ff0000][b], 1, FBufferSize)[/b][/color]);
Aber schon witzig, daß es dennoch manchmal problemlos läuft.

Zitat von chaosben:
[edit]auch nicht[/edit].
manchmal schon


Zum Glück muß ich Fehler jetzt nur noch in einer Version fixen
Ein Therapeut entspricht 1024 Gigapeut.
  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 22:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz