Problem beim Text einlesen. LoadFromFile
-
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?
-
kpeter schrieb:
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?
Ich lese den Beitrag sowohl, aber Tatsache ist es ja, dass man die Datei einlesen kann!
Nur wenn man die Datei "quasi" nochmals abspeichert.Deshalb fragte ich nochmals, sorry.
-
Würde es vlt mit dem Dateihandling operatoren wie
fopen, fread , etc.
Könntet ihr mir da vlt ein bsp zeigen?
Edit
ifstream file; AnsiString fileName = "c:\\1\\log.txt"; file.open(fileName.c_str()); // oeffen im Text-Modus if(file) { AnsiString text; // Haupttext while(!file.eof()) { char buffer; // Buffer file.get(buffer); text += buffer; // Zeichen zusammensetzen } Memo1->Lines->Add (text); // fertigen Text ausgeben file.close(); } else { Memo1->Lines->Add( "Datei Fehler!"); }
so geht das auch nicht
Mano
-
Hallo
teste mal folgenden Code:
#include <memory> #include <stdio.h> // Funktion mit in die cpp: long filesize(FILE *stream) { long curpos, length; curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); fseek(stream, curpos, SEEK_SET); return length; } void __fastcall TForm1::Button2Click(TObject *Sender) { if (OpenDialog1->Execute()) { FILE * file; if ((file = fopen(OpenDialog1->FileName.c_str(), "rb"))== NULL) return; long fsize = filesize(file); fseek(file, 0L, SEEK_SET); // Zeiger auf Dateianfang std::auto_ptr<AnsiChar> pszBuffer(new AnsiChar[fsize+1]); int iBytesRead = fread(pszBuffer.get(), 1, fsize+1, file); fclose(file); String Text; for (int i = 0; i < iBytesRead; i++) { char byte = pszBuffer.get()[i]; if (isascii(byte)) Text += byte; } Memo1->Text = Text; } }
-
Musste den Code einwenig abändern:
long filesize(FILE *stream) { long curpos, length; curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); fseek(stream, curpos, SEEK_SET); return length; } void __fastcall TForm1::Button1Click(TObject *Sender) { if (OpenDialog1->Execute()) { FILE * file; // if ((file = fopen(OpenDialog1->FileName.c_str(), "rb"))== NULL) // return; long fsize = filesize(file); fseek(file, 0L, SEEK_SET); // Zeiger auf Dateianfang std::auto_ptr<AnsiChar> pszBuffer(new AnsiChar[fsize+1]); int iBytesRead = fread(pszBuffer.get(), 1, fsize+1, file); fclose(file); String Text; for (int i = 0; i < iBytesRead; i++) { char byte = pszBuffer.get()[i]; if (isascii(byte)) Text += byte; } Memo1->Text = Text; } }
Weil bei FileName.c_str();
kommet die Fehlermeldung dass es nicht zu w_char konverteiert werden kann.
--------------------------------------------------------------------------
Hab das mal compiliert, und folgender Fehler:
-
inek68 schrieb:
Musste den Code einwenig abändern:..
Wenn du die Zeilen 16 und 17 kommentierst (aus dem Programmablauf entfernst), ist file unbestimmt und produziert den Fehler !
Du wirst den Dateinamen doch da reinbekommen ?