none
Typecasting bei VC++2010 RRS feed

  • Frage

  • Hallo,

    beim Typecasting zum Abspeichern von Daten in VC++2010 habe ich Probleme.

    Unter VC++6.0 konnte ich folgendes machen.

     

    #include <string>

    #include <fstream>

     

    using namespace std;

    ....

    main()

    ...

    ofstream wert ("Daten.txt");

    ...

    wert<<string (Vorname)<<"\n"; //Vorname aus MFC Oberfläche vom Typ CString

    ....

    wert.close();

     

    Die Fehlermeldung lautet wie folgt:

    CStringW kann nicht in std:string konvertiert werden

    Kompiliert wurde mit den Standardeinstellungen von VC++2010. Unter der VC++6.0 Version funktionieren diese Anweisungen problemlos.

    Wäre schön, wenn mir jemand helfen könnte.

    Montag, 9. Januar 2012 08:09

Antworten

  • bekomme ich unter der 6.0 Version den Inhalt abgespeichert.
    In der 2010 funktioniert dieses Typecasting nicht mehr, egal ob in der Multibyte oder Unicode Einstellung (m_pSet->m_Name  ist vom Typ CString)
    Leider habe keine entsprechende Literatur gefunden und auch im Netz verzweifel ich etwas an der Suche.

    Wenn m_Name ein CString ist, dann darfst Du diesen nicht einfachmit dem << Operator verwenden. Wie kommst Du darauf?
    CString ist auch keine Klasse der STL, deshalb gibt es keinen eingebauten operator<<!

    In keinem Fall würde der Implizite LPCSTR Operator verwenden werden.

    Richtig wäre dann alleine:

    schueler<<m_pSet->m_Name.GetString()<<"\n";

    Siehe auch:
    http://blog.m-ri.de/index.php/2008/01/08/die-unsitte-objekte-direkt-in-printf-und-funktionen-mit-variabler-anzahl-von-argumenten-zu-nutzen/
    http://blog.m-ri.de/index.php/2007/09/12/die-cx2y-falle/


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 6. Februar 2012 09:00
  • Die Fehlermeldung lautet wie folgt:

    CStringW kann nicht in std:string konvertiert werden

    Kompiliert wurde mit den Standardeinstellungen von VC++2010. Unter der VC++6.0 Version funktionieren diese Anweisungen problemlos.

    Wäre schön, wenn mir jemand helfen könnte.

    Das ging auch unter VC6 nicht, wenn Du dort in den Projekteinstellungen Unicode eingestellt hast.

    CString ist je nach Projekteinstellungen Unicode oder MBCS. In VS-2010 ist der Standard Unicode. In VC6 war es MBCS.

    Der Code ist eigentlich falsch. Du müsstest hier immer eine Konvertierung über die T-Notation machen oder eben grundsätzlich CStringA verwenden, wenn Du unbedingt immer mir char arbeitest...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 9. Januar 2012 08:44
  • wert<<string (Vorname)<<"\n"; //Vorname aus MFC Oberfläche vom Typ CString
    Die Fehlermeldung lautet wie folgt:
    CStringW kann nicht in std:string konvertiert werden

    Per Default wird ab VS2008 jetzt immer das Projekt mit "UNICODE" angelegt! Deshlab ist CString" immer ein "CStringW".

    Das einfachste ist, Du stellst Dein projekt wieder auf "MBCS" um (Prjekteinstellungen: General|Character Set). Das würde ich Dir aber NICHT empfehlen.

    Wenn Du einfach nur die den CString speichern willst, dann schreib einfach:

        std::ofstream wert("Daten.txt");
         wert << std::wstring(L"test").c_str();
        wert << std::wstring(Vorname).c_str();
        wert.close();

    Wenn Du die Datei selber auch in Inicode speichern willst, dann solltest Du DIch mal mit "std::wostream beschäftigen und auch den Codepages beim schreiben/lesen.


    Jochen Kalmbach (MVP VC++)
    Montag, 9. Januar 2012 08:53
  • Vielen Dank für die Antwort. Diese Antwort hat mir sehr geholfen und mir fällt ein Stein von Herzen.

    Mein Fehler war, dass m_pSet->Name aus einer Datenbankverknüpfung über ODBC stammt. Da ich diesen Datentypen direkt mit einem CString verknüpfen kann, bin ich davon ausgegangen, dass dieser Typ auch CString sein muss. Ein Denkfehler von mir!

    Folgender Code funktioniert:

    ofstream schueler ("Wert.txt");
    while (!m_pSet->IsEOF())
    {
    //m_name von Typ CString
    //m_pSet->m_Name aus Datenbankverknüpfung
    m_name = m_pSet->m_Name;
      schueler << m_name.GetString()<<"\n";
    m_pSet->MoveNext();
    }

    Derselbe Code mit
      schueler << m_pSet->m_Name.GetString()<<"\n";

    liefert nur immer denselben Zeigerwert.

    Vielen Dank an alle Teilnehmer dieses Threads für die wertvolle und hilfreiche Unterstützung.

    Montag, 13. Februar 2012 08:17

Alle Antworten

  • Die Fehlermeldung lautet wie folgt:

    CStringW kann nicht in std:string konvertiert werden

    Kompiliert wurde mit den Standardeinstellungen von VC++2010. Unter der VC++6.0 Version funktionieren diese Anweisungen problemlos.

    Wäre schön, wenn mir jemand helfen könnte.

    Das ging auch unter VC6 nicht, wenn Du dort in den Projekteinstellungen Unicode eingestellt hast.

    CString ist je nach Projekteinstellungen Unicode oder MBCS. In VS-2010 ist der Standard Unicode. In VC6 war es MBCS.

    Der Code ist eigentlich falsch. Du müsstest hier immer eine Konvertierung über die T-Notation machen oder eben grundsätzlich CStringA verwenden, wenn Du unbedingt immer mir char arbeitest...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 9. Januar 2012 08:44
  • wert<<string (Vorname)<<"\n"; //Vorname aus MFC Oberfläche vom Typ CString
    Die Fehlermeldung lautet wie folgt:
    CStringW kann nicht in std:string konvertiert werden

    Per Default wird ab VS2008 jetzt immer das Projekt mit "UNICODE" angelegt! Deshlab ist CString" immer ein "CStringW".

    Das einfachste ist, Du stellst Dein projekt wieder auf "MBCS" um (Prjekteinstellungen: General|Character Set). Das würde ich Dir aber NICHT empfehlen.

    Wenn Du einfach nur die den CString speichern willst, dann schreib einfach:

        std::ofstream wert("Daten.txt");
         wert << std::wstring(L"test").c_str();
        wert << std::wstring(Vorname).c_str();
        wert.close();

    Wenn Du die Datei selber auch in Inicode speichern willst, dann solltest Du DIch mal mit "std::wostream beschäftigen und auch den Codepages beim schreiben/lesen.


    Jochen Kalmbach (MVP VC++)
    Montag, 9. Januar 2012 08:53
  • Hallo Michael3322,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 31. Januar 2012 14:55
  • Vielen Dank für eure Hilfe,

    leider bin ich noch nicht viel weiter. Zuerst habe ich auf Multibyte statt Unicode umgestellt, so dass die MessageBox wieder, so wie ich es gelernt habe, geht.

    Das Typecasting funktioniert aber immer noch nicht so, wie ich möchte.

    ofstream schueler ("schueler.dat");
       Schleife
            schueler<<wstring(m_pSet->m_Name).c_str()<<"\n";

     

    liefert immer noch nicht die richtigen Ergebnisse (statt Buchstaben werden Hex Symbole angezeigt):

    Inhalt schueler.dat

    002EEF50
    029C1678
    002EEF50
    002EEF50
    002EEF50
    002EEF50
    002EEF50
    002EEF50
    002EEF50
    002EEF50
    029C1678
    002EEF50
    002EEF50
    002EEF50
    002EEF50
    029C1678
    002EEF50
    002EEF50
    002EEF50
    029C1678
    002EEF50

     

    Donnerstag, 2. Februar 2012 17:50
  • > ofstream schueler ("schueler.dat");
    > Schleife
    > schueler<<wstring(m_pSet->m_Name).c_str()<<"\n";
    >
     
    wstring ist ein Unicode String. ofstream ist MBCS. Es gibt keine
    Ausgabeoperator für Unicode Strings bei einem MBCS Stream. Also wird die
    Zeigeradresse ausgegeben.
     
    Warum schreibst Du nicht einfach:
    [code]
    schueler<<m_pSet->m_Name<<"\n";
    [/code]
     
     

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 3. Februar 2012 06:57
  • Danke für die Hilfe,

    wenn ich

    [code]
    schueler<<m_pSet->m_Name<<"\n";
    [/code]
    schreibe, wird auch nur die Zeigeradresse ausgegeben und nicht der Inhalt.
    Durch die Stringkonvertierung
    (string)m_pSet->m_Name
    bekomme ich unter der 6.0 Version den Inhalt abgespeichert.
    In der 2010 funktioniert dieses Typecasting nicht mehr, egal ob in der Multibyte oder Unicode Einstellung (m_pSet->m_Name  ist vom Typ CString)
    Leider habe keine entsprechende Literatur gefunden und auch im Netz verzweifel ich etwas an der Suche.
    Freitag, 3. Februar 2012 10:41
  • bekomme ich unter der 6.0 Version den Inhalt abgespeichert.
    In der 2010 funktioniert dieses Typecasting nicht mehr, egal ob in der Multibyte oder Unicode Einstellung (m_pSet->m_Name  ist vom Typ CString)
    Leider habe keine entsprechende Literatur gefunden und auch im Netz verzweifel ich etwas an der Suche.

    Wenn m_Name ein CString ist, dann darfst Du diesen nicht einfachmit dem << Operator verwenden. Wie kommst Du darauf?
    CString ist auch keine Klasse der STL, deshalb gibt es keinen eingebauten operator<<!

    In keinem Fall würde der Implizite LPCSTR Operator verwenden werden.

    Richtig wäre dann alleine:

    schueler<<m_pSet->m_Name.GetString()<<"\n";

    Siehe auch:
    http://blog.m-ri.de/index.php/2008/01/08/die-unsitte-objekte-direkt-in-printf-und-funktionen-mit-variabler-anzahl-von-argumenten-zu-nutzen/
    http://blog.m-ri.de/index.php/2007/09/12/die-cx2y-falle/


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 6. Februar 2012 09:00
  • Vielen Dank für die Antwort. Diese Antwort hat mir sehr geholfen und mir fällt ein Stein von Herzen.

    Mein Fehler war, dass m_pSet->Name aus einer Datenbankverknüpfung über ODBC stammt. Da ich diesen Datentypen direkt mit einem CString verknüpfen kann, bin ich davon ausgegangen, dass dieser Typ auch CString sein muss. Ein Denkfehler von mir!

    Folgender Code funktioniert:

    ofstream schueler ("Wert.txt");
    while (!m_pSet->IsEOF())
    {
    //m_name von Typ CString
    //m_pSet->m_Name aus Datenbankverknüpfung
    m_name = m_pSet->m_Name;
      schueler << m_name.GetString()<<"\n";
    m_pSet->MoveNext();
    }

    Derselbe Code mit
      schueler << m_pSet->m_Name.GetString()<<"\n";

    liefert nur immer denselben Zeigerwert.

    Vielen Dank an alle Teilnehmer dieses Threads für die wertvolle und hilfreiche Unterstützung.

    Montag, 13. Februar 2012 08:17