Problem beim Text einlesen. LoadFromFile
-
KN4CK3R schrieb:
ich nehme an, das hat er so in seinem Programm und das war nur die schnelle Forenversion. Würde der Builder wahrscheinlich auch nicht kompilieren ohne die "
greetz KN4CK3R
Die Datei lässt sich gut compilieren, der Pfad wurde nur für das Forum weg gemacht.
-
Hab mal die LOG Datei genauer angeschaut, erst kommen paar Buchstaben danach 2-3 Leerzeilen, genau diese Leerzeilen werden zum Verhägnis... doch öffne ich diese Datei und tue von mir aus ein X ans ende, wird die Datei gelesen...
Seltsam so ein Problem...würde es vlt mit
TMemoryStream *ms = new TMemoryStream();
besser laufen?
Wenn ja könnte mir jemand vielleicht helfen bei
TMemoryStream *ms = new TMemoryStream();
, wie ich das so genau machen soll?!
Oder eine andere Variante Text einzulesen mit VCL ?
-
Hallo,
ein TMemoryStream zum Einlesen einer Textdatei ist nicht anzuraten, da es keine Eigenschaft Strings besitzt. Die brauchst du ja, um zeilenweise deine Datei zu analysieren.
Eine TStringList ist die bessere Wahl.
Um die Leerzeilen zu beseitigen, habe ich mal den folgenden einfachen Code geschrieben.TStringList* Src = new TStringList; Src->LoadFromFile("access.log"); // Zeilen im StringList einzeln auf Inhalt prüfen for ( int i=0; i < Src->Count; i++) { String Line = Src->Strings[i]; // Die Methode TrimLeft gibt ein neues AnsiString-Objekt ohne führende Leer- und Steuerzeichen zurück. Line.TrimLeft(); if (Line == "") continue; else Memo1->Lines->Add(Line); } delete Src;
mfg
kpeter
-
// Die Methode TrimLeft gibt ein neues AnsiString-Objekt ohne führende Leer- und Steuerzeichen zurück.
Genau darum muß man dann aber folgendes schreiben:
Line = Line.TrimLeft();
-
-
Vielen Dank,
für die Beiträge,
Habe dein Lösungsansatz mal soweit in den Compilier geworfen, leider ändert das nicht an dem Problem.
Da es geht, wenn ich die Datei einmal öffne und ein x-beliebigen Buchstabe oder Zeichen einfüge und dann neu abspeichere.
Hab das dann mal so versucht:
char s='m'; fstream datei; datei.open("c:\\", ios::app); //Öffnen der Datei datei.seekg(0, ios::end); //Sucht das Ende der Datei datei.put(s); datei.close();
funktioniert wieder nicht!
Dann habe ich gedacht, ok, ich versuche mit Dateinamenänderung.
MoveFile("log1" , "log2");
Das funktioniert auch nicht! Man das ist so frustierend!
-
Aber du kannst doch eine beliebige andere Textdatei (z.B. von Notepad erstellt) einlesen?
-
kpeter schrieb:
Aber du kannst doch eine beliebige andere Textdatei (z.B. von Notepad erstellt) einlesen?
Ja, ich kann das alles einlesen, kein Problem! Bis auf diese Log Datein.
-
Welches Programm erstellt die denn?
-
kpeter schrieb:
Welches Programm erstellt die denn?
so ein Prog von einem Freund! Eigenentwicklung!
Das sollte eigentlich nicht ausschlaggebend sein, weil wenn man diese Datei mit einem Texteditor, egal welchem wird diese Datei samt Textinhalt angezeigt.
Nur nicht mit meinem Programm.
-
Hmm,
nimm mal anstelle des Memo ein TRichEdit, muss aber nicht unbedingt was bringen.
Probier dort mal PlainText aus.
-
kpeter schrieb:
Hmm,
nimm mal anstelle des Memo ein TRichEdit, muss aber nicht unbedingt was bringen.
Probier dort mal PlainText aus.
An sich lade ich doch die Datei in eine StringList und gebe sie nur nochmals in einem Memo Feld aus.
Was hat dieses Plain Text an sich ?
-
Möglicherweise ist deine Logdatei keine reine Textdatei und enthält noch Textformatierungen....
PlainText:
Gibt an, ob das Steuerelement den Text beim Lesen oder Schreiben einer Datei als normalen Text oder als Rich Text behandelt.
-
Hallo also bei mir funktioniert das so.
Klick auf button wird komplett meine Logfile eingetragen und angezeigt.void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList* stlData = new TStringList(); stlData->LoadFromFile("c:\\Test.log"); Memo1->Lines->Add(stlData->Text); }
PS: geht mit allen .txt, .log files was so auf dem rechner zu finden ist.
-
kpeter schrieb:
Möglicherweise ist deine Logdatei keine reine Textdatei und enthält noch Textformatierungen....
PlainText:
Gibt an, ob das Steuerelement den Text beim Lesen oder Schreiben einer Datei als normalen Text oder als Rich Text behandelt.@kpeter: Die Datei beinhaltet auch Sonderzeichen.
Was für mich sehr komisch ist, dass wie schon erwähnt, wenn ich die Textdatei per Hand öffne und egal ob ich ein Buchstabe oder Zeichen hinzufüge oder davon lösche, dann am Schluss bei der Frage "Änderungen an diesem Dokument speichern" "JA" mit JA bestätige.Dann anschließend so in meinem Programm lade:
void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList* stlData = new TStringList(); stlData->LoadFromFile("c:\\Test.log"); Memo1->Lines->Add(stlData->Text); }
funktioniert es super.
Doch ich möchte gerne dass das automatsich geladen wird.
-------------------------------------------------
Beim automatischen laden, kommen nur die ersten paar Zeichen in die StringList, in diesem Fall sind es Sonderzeichen.
-
Eventuell kannst du ja mal die Textdatei irgendwo hochladen. Ich denke mal das dieses Verhalten definitiv durch diese Datei hervorgerufen wird.
-
inek68 schrieb:
kpeter schrieb:
Möglicherweise ist deine Logdatei keine reine Textdatei und enthält noch Textformatierungen....
PlainText:
Gibt an, ob das Steuerelement den Text beim Lesen oder Schreiben einer Datei als normalen Text oder als Rich Text behandelt.@kpeter: Die Datei beinhaltet auch Sonderzeichen.
Was für mich sehr komisch ist, dass wie schon erwähnt, wenn ich die Textdatei per Hand öffne und egal ob ich ein Buchstabe oder Zeichen hinzufüge oder davon lösche, dann am Schluss bei der Frage "Änderungen an diesem Dokument speichern" "JA" mit JA bestätige.Dann anschließend so in meinem Programm lade:
void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList* stlData = new TStringList(); stlData->LoadFromFile("c:\\Test.log"); Memo1->Lines->Add(stlData->Text); }
funktioniert es super.
Doch ich möchte gerne dass das automatsich geladen wird.
-------------------------------------------------
Beim automatischen laden, kommen nur die ersten paar Zeichen in die StringList, in diesem Fall sind es Sonderzeichen.
@ inek68
geht auch wenn ich die Form automatisch lade.
Es wird alles angezeigt egal was für datein ich angebe .
Hmmm selbst mit Sonderzeichen usw.void __fastcall TForm1::FormCreate(TObject *Sender) { TStringList* stlData = new TStringList(); stlData->LoadFromFile("c:\\Test.log"); Memo1->Lines->Add(stlData->Text); }
-
2 Möglichkeiten gibts da erst mal:
In einem Hex-Editor kannst du die Datei selbst öffnen und nachsehen, ob nichtdruckbare Zeichen enthalten sind
Frage deinen Freund, wie/womit/als was er diese Datei erzeugt...
-
Wie kann man sich dieses Phänomen erklären?
Das es erst in die StringList genommen wird, wenn man eine Änderung an dem Dokuemnt vornimmt.Habt ihr eine Idee?
-
inek68 schrieb:
Habt ihr eine Idee?
kpeter schrieb:
2 Möglichkeiten gibts da erst mal:
In einem Hex-Editor kannst du die Datei selbst öffnen und nachsehen, ob nichtdruckbare Zeichen enthalten sind
Frage deinen Freund, wie/womit/als was er diese Datei erzeugt...
Warum liest du meinen Beitrag nich?