Komische Zeichen beim Lesen einer Textdatei



  • Hallo!

    Ich hab ein kleines Probelm: Wenn ich eine Textdatei einlese erhalte ich komische Zeichen am Ende dieser, wenn ich deren Inhalt im Programm anzeige.
    Z.B. "beispieltextýýýý" oder so ähnlich.

    Speichere ich den Inhalt dann wieder in eine andere Textdatei ab, so verschwinden diese ýýýý wieder. Anscheinend handelt es sich hierbei um irgenwelche Spezialzeichen die wohl eine Bedeutung für NotePad haben.

    Wie ist es möglich diese rauszufiltern!? Ja, natürlich könnte ich jetzt beim Hereinladen der Datei ab dem ersten ý abbrechen, aber das ist ja auch nicht Sinn der Sache, denn was ist wenn man gewollt diesen Buchstaben in Notepad verwendet...!

    Grüße,
    Harri



  • Wie liest du die Datei denn ein? 🙂
    Welches Programm hat sie erstellt?



  • void CStrreplaceDlg::OnLaden() 
    {
    	UpdateData(TRUE);
    	int n;
    	CFile d_ein(m_laden, CFile::modeRead);
    	len=d_ein.GetLength();
    
    	str=new TCHAR[len];
    
    	d_ein.Read(str,len);
    	d_ein.Close();
    
    	n=0;
    	while(n<len)
    	{
    		if(str[n]==',')
    			str[n]='.';
    		n++;
    	}
    
    	m_textausgabe=str;
    	UpdateData(FALSE);
    
    }
    

    Erstellt wurde die Textdatei mit Notepad.
    Auch im Hexeditor wird nur der normale Text angezeigt. Keine Ahnung woher der Rest denn kommt!? die Längenabfrage ergibt beim Wort Hallo in der Textdatei auch den Wert 5, also darf weder der erstellte String noch die Länge des hereingeladenen Strings größer sein.

    Grüße,
    Harri



  • Ich tippe darauf, daß diese zusätzlich angezeigten Zeichen zufällig hinter dem per new reservierten Speicher liegen - und deshalb von C mitgenommen werden, wenn du sie verarbeitest. Reservier dir am besten ein Byte mehr und belg es mit 0, dann hast du ein definiertes Stringende:

    str=new TCHAR(len+1);
    d_ein.Read(str,len);
    str[len]=0;
    

    (PS: Übrigens fehl da noch ein "delete[]str;" am Ende deiner Funktion)



  • Danke, das wars.
    Ähh, das 0 entspricht eh dem Zeichen '\0' in ANSI C? Dort habe ich es zumindest immer mit '\0' gemacht.

    Mit dem delete[] hab ich ein kleines Problem, da ich str noch in einer anderen Funktion brauche. Habt ihr irgendeine Idee wie ich das lösen könnte!?

    Grüße,
    Harri



  • Du könntest das Array nicht in der Funktion, sondern als member der Klasse deklarieren. In der Funktion initialisierst Du es dann halt nur.

    Das delete machst Du dann entweder, wenn Du mit Deiner Verarbeitung fertig bist - oder im Destruktor der Klasse (da aber am besten sowieso). Und denk dran, es mit NULL zu initialisieren und im Destruktor drauf zu prüfen, bevor Du delete[] machst.



  • Ich hab TCHAR *str; sowieso als Member Variable deklarieret.
    Das mit dem Destruktor hätte ich sowieso auch machen wollen, konnte aber keinen Destruktor finden(ich hab mir das Projekt mit dem MFC Assistenten erstellen lassen). Den Konstruktor konnte ich finden, nicht aber den Destruktor. Wo befindet sich der!?

    Grüße,
    Harri



  • der Destruktor müsste

    CStrreplaceDlg::~CStrreplaceDlg()
    

    heissen, und sich in Deinem Header sowie Deiner Implementation befinden.



  • Diese Zeichen sind eigentlich Symbole aus dem Unicode.
    Ist es möglich,dass dein Textfile so abgespeichert ist?



  • Danach hab ich bereits gesucht, konnte ber nix finden.

    Füge ich die Destruktor manuell unterm Konstruktor hinzu, so gibt es folgende Fehlermeldung:
    function '__thiscall CStrreplaceDlg::~CStrreplaceDlg(void)' already has a body

    Anscheinend ist der Destruktor doch schon irgendwo vorhanden ,versteckt sich aber vor mir.(oder ich bin blind*g*)

    mfg
    harri



  • in der headerdatei schon den virtual ~CDestruktor
    eingefügt?



  • Gib doch mal CStrreplaceDlg::~CStrreplaceDlg() irgendwo im Code ein, und mach dann rechte maustaste -> Gehe zu Definition



  • Nö,findet er auch nicht.
    Aber anscheinend ist ein Destruktor vorhanden, sonst könnte ich ihn ja manuell einfügen.
    Merkürdig.

    Mit dem Thema C++ in Kombination mit MFC muss ich mich wohl noch mehr auseinandersetzen. Bis jetzt hab ich eher maschinennahe Programme für Mikroprozessoren in C geschrieben, der Unterschied zur Windowsprogrammierung ist doch größer als erwartet 😉

    Grüße,
    Harri


Anmelden zum Antworten