Problème de conversion CString et ASCII

Résolu
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009 - 15 juil. 2009 à 16:43
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009 - 19 août 2009 à 17:04
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

cs_alfred2009 Messages postés 6 Date d'inscription samedi 18 juillet 2009 Statut Membre Dernière intervention 28 juillet 2009
18 juil. 2009 à 18:38
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).
3
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
16 juil. 2009 à 16:45
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 *'
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
16 juil. 2009 à 16:52
sans test, regardes vers tmp.Get.. je crois que c'est tmp.GetBuffer(0) te retournera une chaine 'classique'.
0
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
16 juil. 2009 à 17:07
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
]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
17 juil. 2009 à 16:31
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 >.<
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
17 juil. 2009 à 16:50
Va voir ce post. Et tu verras qu'il existe bien une méthode GetBuffer pour CString (MFC).
0
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
17 juil. 2009 à 16:58
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.
0
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
17 juil. 2009 à 17:15
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 ^^" )
0
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
20 juil. 2009 à 08:23
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.
0
Valentintinmar Messages postés 15 Date d'inscription jeudi 4 juin 2009 Statut Membre Dernière intervention 21 août 2009
19 août 2009 à 17:04
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 ?
0