Problem beim Text einlesen. LoadFromFile



  • @Th69, danke für den Hinweis. 🙂

    Ist mir beim Reinkopieren des Hilfetextes passiert? 😞

    mfg
    kpeter



  • Vielen Dank,

    für die Beiträge,

    @kpeter:

    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:

    @Praetorianer_33:

    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:

    @Praetorianer_33:

    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:

    http://www.abload.de/img/unbenannta6ck.jpg


Anmelden zum Antworten