Typecasting bei VC++2010
-
Montag, 9. Januar 2012 08:09
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.
Alle Antworten
-
Montag, 9. Januar 2012 08:44Moderator
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- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Dienstag, 31. Januar 2012 14:55
-
Montag, 9. Januar 2012 08:53
wert<<string (Vorname)<<"\n"; //Vorname aus MFC Oberfläche vom Typ CString
Die Fehlermeldung lautet wie folgt:
CStringW kann nicht in std:string konvertiert werdenPer 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++)- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Dienstag, 31. Januar 2012 14:55
-
Dienstag, 31. Januar 2012 14:55Besitzer
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,
RobertRobert Breitenhofer, MICROSOFT

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. -
Donnerstag, 2. Februar 2012 17:50
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
-
Freitag, 3. Februar 2012 06:57Moderator> ofstream schueler ("schueler.dat");> Schleife> schueler<<wstring(m_pSet->m_Name).c_str()<<"\n";>wstring ist ein Unicode String. ofstream ist MBCS. Es gibt keineAusgabeoperator für Unicode Strings bei einem MBCS Stream. Also wird dieZeigeradresse 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 10:41
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_Namebekomme 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. -
Montag, 6. Februar 2012 09:00Moderator
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- Bearbeitet Martin RichterMVP, Moderator Montag, 6. Februar 2012 09:06
- Als Antwort vorgeschlagen Robert BreitenhoferMicrosoft Contingent Staff, Moderator Montag, 6. Februar 2012 10:07
- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Montag, 13. Februar 2012 12:43
-
Montag, 13. Februar 2012 08:17
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.
- Als Antwort markiert Robert BreitenhoferMicrosoft Contingent Staff, Moderator Montag, 13. Februar 2012 12:43

