_wtol gibt 0 zurück



  • Hallo Community,

    ich habe ein neues Doc/View Projekt erstellt. Als Zeichensatz ist Unicode eingestellt.

    In dem Projekt habe ich mir eine neue Klasse erzeugt, diese Klasse hat als Member 3 CString's. Diese Klasse ist für die funktion "Serialize" vorbereitet.

    Die Headerdatei:

    class CJSxAppsFile :
        public CObject
    {
    public:
        CJSxAppsFile();
        ~CJSxAppsFile();
    
        void Serialize(CArchive& ar);
    
        DECLARE_SERIAL(CJSxAppsFile);
    
    private:
    
        CString m_sNummer;
        CString m_sName;
        CString m_sDataLine;
    
    };
    

    Die Quelldatei:

    IMPLEMENT_SERIAL(CJSxAppsFile, CObject, VERSIONABLE_SCHEMA | 2)
    
    CJSxAppsFile::CJSxAppsFile()
    : m_sNummer(_T(""))
    , m_sName(_T(""))
    , m_sDataLine(_T(""))
    {
    }
    
    CJSxAppsFile::~CJSxAppsFile()
    {
    }
    
    void CJSxAppsFile::Serialize(CArchive& ar)
    {
        if (ar.IsStoring())
        {
            // TODO: Hier Code zum Speichern einfügen
    
            // die Klasse soll nur lesen, 
            // die Daten werden nicht geschrieben
        }
        else
        {
            // TODO: Hier Code zum Laden einfügen
            ar.ReadString(m_sNummer);
            long nNummer = _wtol(m_sNummer);   -->> hier bekomme ich immer nur 0
    
            switch (nVersion)
            {
                case 2:
                    ar >> m_sName;
                    ar >> m_sDataLine;
                    break;
                default:
                    AfxMessageBox(L"Fehler beim Lesen", MB_OK);
                    break;
            }
        }
    }
    

    Die Klasse liest eine Text-Datei in der sind die Daten jeweils in einer Zeile,
    die Datei sieht zb. so aus:

    2
    Name
    Daten 123456
    

    In der Member m_sNummer wird die 2 richtig eingelesen, nur wenn ich das einem long durch _wtol (wie oben) zuweise bekomme ich immer eine 0, warum?

    Kann mir jemend weiter helfen, was mache ich falsch?



  • 'tschuldigung,
    hatte vergessen zu erwähnen das die Textdatei auch in Unicode geschrieben wurde.



  • Sind da Whitespaces (Leerzeichen, Zeilenumbruch) drin?
    Warum nicht einfach

    ar >> m_sNummer
    

    (bzw. warum ist die Nummer selbst kein "int" als Member)?



  • Guten Morgen,

    diese Datei bekomme ich von einem anderen Programm und ist so vorgegeben. Ja da sind Zeilenumbrüche drin.

    Ein int wäre dann ja binär und das ist leider nicht so. Ich hatte auch schon den Hinweis gegegben das, wenn das binär ist einfacher zu handhaben ist, der Kommentar dazu war das die Datei von einem Texteditor auch gelesen werden muss. Keine Ahnung warum. Ich hatte auch schon mit

    int m_nNummer;
    

    und in der Funktion

    ar >> m_nNummer
    

    versucht, aber kein vernünfiges Ergebnis.
    m_nNummer hat dann den Wert 3342079.

    Mache ich das gleiche mit dem CString

    ar >> m_sNummer;
    

    bekomme ich "Unbekanntes Dateiformat"



  • Ich meinte explizit nach dem Lesen von m_sNummer, ob dort Zeilenumbrüche o.ä. drin sind, denn dann kann _wtol diese nicht verarbeiten.



  • sorry, dann habe ich dich falsch verstanden, nein in m_sNummer steht nur die 2
    bzw im Debugfenster Übewachen steht:

    +m_sNummer	L"2"	ATL::CStringT<wchar_t, StrTraitMFC_DLL<wchar_t, ATL::ChTraitsCRT<wchar_t> > >
    

    Äh, wo kommt denn dieses

    ""
    

    her??
    Das sehe ich nicht im Überwachenfenster!

    Wenn ich mit der Maus über die Member m_sNummer bin wird

    L"2"
    

    angezeigt.

    Dann ist doch irgendwo eine Projekt-Einstellung falsch,
    ich habe nur ein Doc/View mit Unicode Zeichensatz erstellt,
    lese eine Unicode Text-Datei und dann sowas.



  • 65279 = 0xFEFF

    Das ist der BOM der Unicode-Datei. Diesen mußt du also explizit überlesen (oder die Datei ohne BOM abspeichern).



  • Boh ey, ist das gemein.

    Ich dachte auf Zeichensatz Unicode einstellen und dann mit CArchive einlesen,
    das war wohl nix.

    Vielen Dank Th69 ich weiss nun nach was ich suchen muss,
    auf

    www.codeproject.com
    

    finde ich bestimmt etwas dazu.

    Ich werde berichten.



  • Ich bedanke mich aber auch bei dir für die Eigeninitiative und die gute Fehlerbeschreibung - ist bei manchen Themen hier leider nicht immer der Fall. 👍

    Probiere mal A UTF-16 Class for Reading and Writing Unicode Files.

    Und zum Schreiben (falls doch mal erforderlich) hier noch ein Beitrag von einem anderen User (Jochen Kalmbach) dieses Forums: How to write Textfiles with encoding in MFC