Problème de conversion CString et ASCII [Résolu]

Signaler
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009
-
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009
-
Bonjour à tous,

Après plusieurs heures à eccumer le net en recherche d'indices, j'en viens à vous exposer mon problème dans l'espoir de quelques lumières quand à mes souçis :

Je code dans environement Visual C++ ( j'espère ne pas m'être trompé de thème )

Voici mon problème : Je récupère des données dans un CString Array, puis je parcoure ce vecteur pour recopier les valeurs dans un .CSV

En clair, j'ai un CStringArray de la forme :
(1) 65
(2) 66
(3) 67
Qui est transformé en un :
CString strValue="65;66;67" alors que j'aimerai avoir strValue="A;B;C"
Il est important que la solution sois sous une forme CString.

Voilà un extrait du code concernant mon problème.
-----------------------------------------------------
CString strValue;
CStringArray strArValue;
VARIANTToStr(pAppItem->GetValue(),strArValue);
//place les données dans le vecteur
for (int i=0; i<strArValue.GetSize(); i++)
{
strValue+=strArValue[i]; //passage à ploblème.
if(i<strArValue.GetSize()-1)
{strValue+=";";}
}
-----------------------------------------------------

J'ai essayé diverse solution comme passer mon CString en int via atoi pour revenir en char sans succès.

Je vous remercie par avance de l'attention que vous voudrez bien porter à ma requette.

10 réponses

Messages postés
6
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
28 juillet 2009

L'erreur C2664 rencontrée plus haut semble indiquer que tu travailles en Unicode.
En Visual C, tu peux le vérifier par l'ajout de :
#ifdef UNICODE
#pragma message ("unicode")
#endif
"unicode" s'affichera si cela est bien le cas dans la fenêtre de résultat de la compilation.

En utilisant les macros de tchar.h, qui permettent d'avoir des sources identiques pour des projets en Unicode ou en ANSI chez MS, j'ai repris un peu ton code, qui renvoit "A;B;C" dans les 2 cas :
CString strValue;
CStringArray strArValue;
strArValue.Add( _T("65") );
strArValue.Add( _T("66") );
strArValue.Add( _T("67") );
for (int i=0; i<strArValue.GetSize(); i++)
{
strValue += static_cast<TCHAR>( _ttoi(strArValue[i]) );
if(i<strArValue.GetSize()-1)
{
strValue+=";";
}
}
_tprintf( _T("%s\n"), strValue );

En ANSI, _ttoi correspond au atoi, TCHAR à char.
le cast en TCHAR force la résolution d'opérateur à += (TCHAR) de la classe CString, ce qui converti l'entier en son caractère Ascii équivalent.
Après la boucle, les caractères contenus dans strValue sont soient codés sur 1 octet (cas ANSI), soient sur 2 octets poids fort à 0 dans cet exemple (cas Unicode).
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

Actuellement j'essaye de traduire mon CString en int, mais atoi ne semble pas marcher comme il le devrais.

Je fais l'essai suivant :

CString tmp ="65";
int toto = atoi(tmp);

Et j'obtiens cette erreur :
error C2664: 'atoi' : impossible de convertir le paramètre 1 de 'CString' en 'const char *'
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
sans test, regardes vers tmp.Get.. je crois que c'est tmp.GetBuffer(0) te retournera une chaine 'classique'.
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

Rejeté ^^"
J'obtiens l'erreur suivante :

error C2039: 'Getbuffer' : n'est pas membre de 'ATL::CStringT'
with
[
BaseType=wchar_t,
StringTraits=StrTraitMFC_DLL<wchar_t>
]




J'ai essayé la plupart des solutions proposées sur le forum sans succès.
Par exemple avec :
int toto = atoi(tmp.GetString());

J'obtiens alors l'erreur :

error C2664: 'atoi' : impossible de convertir le paramètre 1 de 'ATL::CSimpleStringT::PCXSTR' en 'const char *'
with
[
BaseType=wchar_t,
t_bMFCDLL=true
]
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

Pour poser le problème autrement.....

J'aimerai faire en sorte de changer le contenu de ma CString de :
strValue "65" en son code ASCII correcpondant. strValue "A"

Ou éventuellement le faire dans un const char* :
const char* charValue="65" et idem avoir l'équivlanet ascii charValue="A"


Je sèche depuis plusieurs jours >.<
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
Va voir ce post. Et tu verras qu'il existe bien une méthode GetBuffer pour CString (MFC).
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

Mon problème n'est pas tant pour traduire un CString en const char ( ça j'y arrive ), mais surtout d'interpréter correctement le contenu de mes variables.

Pour pouvoir sauvegarder mes données dans un .csv je transforme déjà mes CString en const char*.


Mon problème c'est que j'inscrit les codes ascii dans ma sauvegarde à la place d'inscrire les caractères ascii et jusqu'à présent je suis incapable d'effectuer cette traduction.
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

J'ai oublié de précisé que la technique que je pensais utiliser à savoir :

int toto = atoi((char*)LPCTSTR (strArValue[i]))
char titi = (char)toto;
strValue+=titi;

compile de manière correcte mais les résultats sur ma sauvegarde sont abhérants : tout mes caractères ont la même valeur ou mon executable plante selon la technique de conversion utilisée.

( d'où le reformulation de mon problème ^^" )
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

Effectivement je n'ai pas précisé que je travaillais en unicode, erreur de débutant, mille excuses.

Merci pour la réponse, et merci pour la leçon.
Messages postés
15
Date d'inscription
jeudi 4 juin 2009
Statut
Membre
Dernière intervention
21 août 2009

Bonjour !

Je révouvre le sujet suite à un petit problème, est-il possible de convertir les caractère ASCII spéciaux en leur équivalent hexa ?