StringReplace() scheint zu hängen...
-
Hallo Leute!
In ein Programm (mit BCB6) lese ich eine Textdatei in ein RichEdit ein. Dieser Text soll dann in eine ListBox zur Weiterverarbeitung. Dazu lasse ich im RichEdit Zeile für Zeile suchen und bestimmte Zeichen durch "\r\n" ersetzen mit:
RichEdit1->Text = StringReplace(RichEdit1->Text, "," , "\r\n" , TReplaceFlags() << rfReplaceAll);und Leerzeichen killen mit:
RichEdit1->Text = StringReplace(RichEdit1->Text, " " , "" , TReplaceFlags() << rfReplaceAll);Wenn die eingelesene (Text)~datei jedoch größr wird dauert es sehr lange diese zu durchsuchen und die Aktionen durchzuführen. In dieser Zeit scheint es immer als ob das Programm hängt. "Keine Rückmeldung" aber CPU bei 100%...
Jedenfalls hatte ich gehofft ihr könnt mich beraten wie ich das am besten behebe, denn mit einem solchen Programm kann niemand arbeiten, nur ich sehe keine Lösung... Ich habe an Application->ProgressMessages() gedacht, aber kann man sowas da iwi einfügen?
Guten Abend und danke schonmal,
Tippo
-
Hallo
Zum einen muß der ganze AnsiString ja zweimal durchgegangen werden, um beide Ersetzung nacheinander durchzuführen. Zum andern erlauben dir diese hohen Funktionen keine nebenläufige Messageverarbeitung (ohne Threads).
Beide Probleme löst du indem du manuell alle Zeichen durchgehst und jeweils gleichzeitig nach ',' und ' ' Ausschau hälst. Dann kannst du auch nebenbei eine Fortschrittsanzeige einbauen und andere Messages verarbeiten lassen (Siehe Application->ProcessMessages(); ).
Dazu benutzt du dann aber am besten Streams, wie TFileStream oder std::fstream.bis bald
akari
-
Hallo und danke für die schnelle Antwort.
Auch wenn ich keine Ahnung von der Verwendung von TFileStream oder std::fstream habe.
Aber wenn ich etwas in einen Stream lade, dann mus ich doch auch iwi wieder die einzelnen Zeichen suchen, würde das genauso lange dauern?Beide Probleme löst du indem du manuell alle Zeichen durchgehst und jeweils gleichzeitig nach ',' und ' ' Ausschau hälst.
Dazu benutzt du dann aber am besten Streams, wie TFileStream oder std::fstream.
Gibt es zu diesen Streams Tutorials? Denn damit habe ich noch nie bekanntschaft schließen müssen...

Also dann.
MfG
Tippo
-
Hallo
Tippokrates schrieb:
Aber wenn ich etwas in einen Stream lade, dann mus ich doch auch iwi wieder die einzelnen Zeichen suchen, würde das genauso lange dauern?
Zum einen bedeutet deine Variante das der AnsiString zweimal durchsucht wird.
Bei einem manuellen Durchgang könntest du aber nach beiden Zeichen gleichzeitig ausschau halten.Desweiteren sind Streams optimaler im Bereich sequentieller Arbeit. Bei AnsiString muß beim Ersetzen von 1 Zeichen durch 2 Zeichen der ganze nachfolgende Rest kopiert werden um Platz zu schaffen.
Die bessere Lösung wäre ein In-Stream (Original) und ein Out-Stream (Bearbeitung). In jedem Durchgang liest du aus Original ein Zeichen aus un wertest es aus. Wenn es ersetzt werden soll schiebst du die neuen Zeichen in die Bearbeitung, wenn nicht das Zeichen aus Original. Das soll so lange laufen wie noch Zeichen in Original sind. Damit wird minimal kopiert.Gibt es zu diesen Streams Tutorials? Denn damit habe ich noch nie bekanntschaft schließen müssen...
In der FAQ im C++ Forum ist ein Thread zu "Dateien und Ströme". Da wird std::fstream beschrieben. TFileStream ist ein ganz ähnliches Prinzip, die Doku findest du in der BCB-Hilfe.bis bald
akari
-
Hallo,
Zu den std::streams gibt es ein kurzes Tutorial in der C++FAQ
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39469.html
[edit]
Ein wenig spät, aber dafür mit Link.
[edit]
-
Ich danke euch
und werde mich da wohl jetzt erstmal einarbeiten.