mit CFile aus Datei lesen... merkwürdige ergebnisse



  • Ich habe ein meiner Meinung nach merkwürdiges Problem:
    Ich lese mit folgendem Code aus der Datei, die Datei wird auch gefunden und ausgelesen, jedoch wird in dem EditFeld dann der ganze String angezeigt, also nicht nur der Text, sondern die kompletten Sonderzeichen... Manchmal werden auch nur ein zwei Zeichen ausgelesen... 👎

    CFile file(buffer,CFile::modeRead); //buffer als CString deklariert... Datei wird gefunden!
    	content=(TCHAR*) malloc(file.GetLength()); //content als TCHAR* deklariert
    	file.Read(content,sizeof(content));
    	file.Close();
    
    	m_strContent=content; //m_strContent als CString deklariert und Member des Editfeldes
    	UpdateData(FALSE);
    	free(content);
    

    Ich hoffe es weiß jemand weiter... 👍



  • Immer noch keine Antwort... 😞



  • Lass dir mal sizeof(content) ausgeben.



  • Also, an dem liegt es nicht... Kann es vielleicht sein, dass er den Schluss mit diesen y mit Dach füllt, weil ich die Variable als TCHAR* deklariert habe und nicht als CString... Außerdem macht er auch statt Zeilenvorschub irgendwelche merkwürdigen Balken...



  • Hi,

    könnte vielleicht daran liegen, daß content den blanken Dateiinhahlt ließt und nicht mit Null-Byte abgeschlossener STring ist!?!?
    Versuch doch mal

    DWORD length = file.GetLength;
        content=(TCHAR*) malloc(length + 1); //content als TCHAR* deklariert
        file.Read(content,length);
        content[length + 1] = 0;
    

    Vieleicht hilft's ja was 🙂

    Gruß WinCoder



  • MasterCounter schrieb:

    Ich habe ein meiner Meinung nach merkwürdiges Problem:
    Ich lese mit folgendem Code aus der Datei, die Datei wird auch gefunden und ausgelesen, jedoch wird in dem EditFeld dann der ganze String angezeigt, also nicht nur der Text, sondern die kompletten Sonderzeichen... Manchmal werden auch nur ein zwei Zeichen ausgelesen... 👎

    CFile file(buffer,CFile::modeRead); //buffer als CString deklariert... Datei wird gefunden!
    	content=(TCHAR*) malloc(file.GetLength()); //content als TCHAR* deklariert
    	file.Read(content,sizeof(content));
    	file.Close();
    	
    	m_strContent=content; //m_strContent als CString deklariert und Member des Editfeldes
    	UpdateData(FALSE);
    	free(content);
    

    Ich hoffe es weiß jemand weiter... 👍

    Auch Read() ist begrenzt und kann nich eine enorm grosse Datenmenge gleichzeitig auslesen - was aber wenn du genau das versuchst? Ich würde die daten Häppchenweise in einen Buffer laden und dort weiterverarbeiten.
    ebenfalls kann es Probleme geben, wenn du Binärdaten in einen CString ablegen tust.



  • also, ich öffne die datei ja nicht binär... und eine enorm große datei ist das auch nicht(<1kb... 🙄 ) Aber ich probiers jetzt mal mit dem Vorschlag von WinCoder... ABer eigentlich müsste das doch

    content[length + 1] = '\0';
    

    heißen oder?



  • Ok, funzt auch nicht... Ich bin mit meinem Latein echt am Ende... 😞 Also, falls noch irgendwer eine Idee hat, ich bin für alles offen...



  • Hi,

    hast Du ein Beispiel, wie der Inhalt Deiner Datei aussieht?

    Gruss

    yeti



  • Als test hab ich einen ganz normalen Text (mit dem Editor) geschrieben.
    Und hab das ganze als ganz normale Text Datei(*.txt ANSI) abgespeichert:

    Hallo du da... Ich werde 
    
    gleich
    
    ausgelesen...
    

    raus kommt dann

    Hallo du da... Ich werde||gleich||ausgelesen...YYYYYYYYYYYYYYYYYYYYYYY
    

    wobei | für ein schwarzes Karo steht und Y für das Y mit Dach...



  • Hi,

    ich habs soweit hingebracht, allerdings nur mit ein paar Anpassungen:

    1. Du musst in den Eingenschaften des Edit-Feldes unbedingt "Multiline" auswählen, sonst siehts echt sch.... aus.

    2. Mein Code sieht jetzt so aus (ist jetzt sicher nicht beispielhaft, nur "Quick-and-dirty" 😉 )

    TCHAR* content;
    	int fl;
    	CFile file("C:\\Downloads\\Edit1.txt",CFile::modeRead); //buffer als String deklariert... Datei wird gefunden!
        fl= file.GetLength(); //content als TCHAR* deklariert
        content=(TCHAR*) malloc(file.GetLength() + 1); //content als TCHAR* deklariert
    	content[fl] = '\0';
        fl = file.Read(content,file.GetLength());
        file.Close();
    
        m_strContent=content; //m_strContent als CString deklariert und Member des Editfeldes
        UpdateData(FALSE);
        free(content);
    

    Was hab ich getan? Erstens: Beim Read beziehe ich mich auf die Länge der File, nicht auf die des allokierten Speichers - weiss nicht, warum das was ausmacht...
    Zweitens: Ich terminiere den String mit '\0' auf der ersten Position nach dem Stringende.

    Hoffe, das hilft Dir

    Gruss

    yeti



  • vielen dank, ich werds mal ausprobieren... 👍


Anmelden zum Antworten