typeText fehler bei CFile



  • Moin Leute,

    Hab etwas seltsames gefunden, und zwar:

    [/cpp]CFile IFile;

    IFile.Open(str,CFile::modeRead|CFile::typeText)[/cpp]

    in str steht der vollständige Pfad der Datei drin.
    Sobald das Programm zu dieser Zeile gelangt stürtz es ab.

    Anders:

    CStdioFile IFile;
    
    IFile.Open(str,CFile::modeRead|CFile::typeText)
    

    Hier stürtz das Programm nicht ab. Es ist der gleiche Dateipfad, ich hab die Datei komplett ausgelesen und mir anzeigen lassen. Aber ich habe keine Ahnung wieso und warum der bei CFile einen Fehler ausgibt.

    Es handelt sich dabei übrigens um exportierte Access Tabellen im Textformat.

    MfG

    Nocadas



  • Hallo,

    CFile ist die Basisklasse der diversen File-Klassen, die die MFC bieten. Insbesondere ist sie nicht dafür ausgelegt, den Textmodus zu verarbeiten, denn:

    MSDN schrieb:

    CFile::typeText Sets text mode with special processing for carriage return–linefeed pairs (used in derived classes only).

    Beachte die fettgedruckte Anmerkung in Klammern.

    Und das wird auch gnadenlos abgefangen, damit man auch nicht auf die Idee kommt, ein Open im Textmodus für ein CFile-Objekt aufzurufen, denn im MFC-Quelltext für CFile::Open findet man:

    ASSERT((nOpenFlags & typeText) == 0);   // text mode not supported
    

    Das zweite funktioniert, weil Open für CStdioFile in den MFC geeignet überschrieben wird, und gerade CStdioFile die Klasse ist, die man für Text-Ein-/Ausgabe verwenden sollte (natürlich kann man CStdioFile auch in den Binärmodus schalten, aber Textmodus ist standardmäßig voreingestellt).

    also alles klar, denke ich 😉

    MfG



  • Moin,

    Danke dir, ich dachte mein VC++ hätte nenn Bug, aber....
    die 2. Codestelle

    Probe-Nutzer schrieb:

    ASSERT((nOpenFlags & typeText) == 0);   // text mode not supported
    

    hatte ich auch im Debugger^^. Hatte mich gewundert wieso er dahinspringt.

    Zur 1. Codestelle muss ich sagen, dass das [cpp](used in derived classes only)[/cpp] auch bei CStdioFile stand in der MSDN. Deshalb wurde ich stutzig. Hab dann einfach CStdioFile ausprobiert und siehe da es ging^^.

    Wenn wir grad bei Dateien sind. Wieviele Daten bzw. Zeilen kann ich in einen CArrayString schreiben? Hab inzwischen 137 KB in einer Datei = 1100 Zeilen.

    Was ist da besser:

    1:

    CArrayString ErsterArray;
    

    oder:

    CArrayString *ErsterArray=new CStringArray;
    
    //etwas code
    
    delete ErsterArray;
    

    Und was passiert beim zweiten wenn ich den Array mit Einträgen fülle und dann mit RemoveAll(); wieder lösche. Liegt der Speicher dann brach rum. Weil ich brauche den Array mehrmals in einer Funktion, d.h. Datei öffnen auslesen, bearbeiten, removen und nächste Datei auslesen usw. Muss ich nach dem Removen dann den delete Befehl setzen?

    MfG

    Nocadas



  • Es gibt noch SetSize. 🙂



  • Nabend,

    Mhhh und was mach ich mit SetSize()?
    Hab das schonmal getestet. Hab da eingeben:

    CStringArray bla;
    CString str="";
    
    bla.SetSize(5);
    
    for(int i=0; i<5; i++)
    {
        str.Format("%d",i);
        bla.Add(str);
    }
    

    Als ich mir die größe des Arrays ansah stand da nicht mehr 5 sondern 10...
    Wie geht das^^. Aber ich hab ja oben nur gefragt was besser wäre.
    Heap oder Stack?^^. Da die Dateien auch über 20 MB oder so hinausgehen können und ich weiß nicht wo das Limit beim Stack ist. Die andere Frage war ja auch ob ich jedesmal wenn ich alle Einträge im Array lösche auch

    delete Array
    

    schreiben muss?

    MfG

    Nocadas


Anmelden zum Antworten