Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: MFC (Visual C++) ::  _wtol gibt 0 zurück     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
..joc..
Unregistrierter




Beitrag ..joc.. Unregistrierter 20:28:32 09.09.2017   Titel:   _wtol gibt 0 zurück            Zitieren

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:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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:
Code:
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?
..joc..
Unregistrierter




Beitrag ..joc.. Unregistrierter 22:05:13 09.09.2017   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4611
Beitrag Th69 Mitglied 08:09:52 10.09.2017   Titel:              Zitieren

Sind da Whitespaces (Leerzeichen, Zeilenumbruch) drin?
Warum nicht einfach
C++:
ar >> m_sNummer

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




Beitrag ..joc.. Unregistrierter 09:45:08 10.09.2017   Titel:              Zitieren

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
C++:
int m_nNummer;

und in der Funktion
C++:
ar >> m_nNummer

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

Mache ich das gleiche mit dem CString
C++:
ar >> m_sNummer;

bekomme ich "Unbekanntes Dateiformat"
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4611
Beitrag Th69 Mitglied 11:41:39 10.09.2017   Titel:              Zitieren

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




Beitrag ..joc.. Unregistrierter 11:58:12 10.09.2017   Titel:              Zitieren

sorry, dann habe ich dich falsch verstanden, nein in m_sNummer steht nur die 2
bzw im Debugfenster Übewachen steht:
C++:
+m_sNummer  L"&#65279;2"    ATL::CStringT<wchar_t, StrTraitMFC_DLL<wchar_t, ATL::ChTraitsCRT<wchar_t> > >


Äh, wo kommt denn dieses
C++:
 "&#65279;"
her??
Das sehe ich nicht im Überwachenfenster!

Wenn ich mit der Maus über die Member m_sNummer bin wird
C++:
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.
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4611
Beitrag Th69 Mitglied 13:11:15 10.09.2017   Titel:              Zitieren

65279 = 0xFEFF

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


Zuletzt bearbeitet von Th69 am 13:11:34 10.09.2017, insgesamt 1-mal bearbeitet
..joc..
Unregistrierter




Beitrag ..joc.. Unregistrierter 21:08:11 10.09.2017   Titel:              Zitieren

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
HTML:
www.codeproject.com
finde ich bestimmt etwas dazu.

Ich werde berichten.
Th69
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.03.2008
Beiträge: 4611
Beitrag Th69 Mitglied 09:38:24 11.09.2017   Titel:              Zitieren

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. :live:

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
C++ Forum :: MFC (Visual C++) ::  _wtol gibt 0 zurück   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.