Problem beim Text einlesen. LoadFromFile



  • 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



  • 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 ? 😉



  • Habe es probiert!

    angezeigt wird leider wieder nichts!

    Am Anfang des eingelesen log file stehen diese Buchstaben

    Ôò¡            ÿÿ        KºÝ  (   (
    

    ausgegeben wird in diesem fall nur das 4 zeichen:

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

    Ich bekomme die Krise, wenn ch die Datei wieder öffne und abspeichere funktioniert das einlesen wieder! Bin mit meinen Ideen am Ende, weiss nicht mehr was ich probieren soll.
    kpepter Vielen Dank für dein engagement!

    Gibts eventuell noch andere Möglichkeiten? Winapi etC?



  • Hier eins von diesen Textdokumenten:

    http://www.xup.in/dl,28742637/cPlusplus.log/

    & hier gepacket:

    http://www.xup.in/dl,12647291/cPlusplus.rar/

    testet selbst!

    ---------------------------------------------

    Mein Kumpel meinte, dass er mit Wireshark diese Datein erstellen lässt,genauer über lipcap.h soweit ich das verstanden habe.

    ---------------------------------------------



  • das ist der Inhalt:

    0Ke 33 !B`iv#!p ~lM-SEARCH * HTTP/1.1
    Host:[FF02::C]:1900
    ST⚱Microsoft Windows Peer Name Resolution Protocol: V4:IPV6:LinkLocal
    Man:"ssdp:discover"
    MX:3



  • kpeter schrieb:

    das ist der Inhalt:

    0Ke 33 !B`iv#!p ~lM-SEARCH * HTTP/1.1
    Host:[FF02::C]:1900
    ST⚱Microsoft Windows Peer Name Resolution Protocol: V4:IPV6:LinkLocal
    Man:"ssdp:discover"
    MX:3

    Also das geht bei dir?



  • Ja.

    Das wird im Programm mit BCB3 erstellt, angezeigt.

    Im BCB2009 hatte ich auch nur Anzeige der ersten 3 Zeichen. Das Memo wird da aussteigen?



  • Was meinst du mit das Memo wird da aussteigen?

    Das ist sehr seltsam..



  • Ich denke mal, dass die Textanzeige, sobald ein Zeichen ausserhalb des ASCII-Bereiches auftritt,

    ausgeblendet wird.



  • kpeter schrieb:

    Ich denke mal, dass die Textanzeige, sobald ein Zeichen ausserhalb des ASCII-Bereiches auftritt,

    ausgeblendet wird.

    Das ungewöhnliche ist ja, dass es nur in seiner Rohform nicht zu lesen ist,
    öffnet man diese Datei,ändert sie minimal ab, ließt man es ein, funktionierts topp.

    ICh werde mal meine BCB05 auskraben und damit nochmal probieren, ich werde berichten.



  • Und dem geneigten Leser wird auffallen, dass eben doch eine ganze Menge nicht-druckbarer Zeichen in dem Logfile sind...

    Hast Du mal auf Binärebene die Dateiinhalte zwischen der originalen Datei und er geänderten Datei geprüft? Ich bin mir ziemlich sicher, dass zumindest anschließend keine NULL-Zeichen mehr in der Datei enthalten sind...

    Wie auch immer, auch mit dem BCB 5 wird das nicht funktionieren, da auch dieser den Lesevorgang beim ersten NULL-Zeichen beendet. Also beim fünften Zeichen des Log-Files.

    Ich würde die Datei in einen MemoryStream laden, die ganzen nicht-druckbaren Zeichen maskieren und dann erst die Zuweisung an das Memo durchführen.


Anmelden zum Antworten