Sprintf récalcitrant

Résolu
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005 - 2 mars 2005 à 18:18
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005 - 3 mars 2005 à 09:46
Bonjour,



Je suis assez une pine en C alors évitons les railleries! Merci



Voici ma question... Lorsque je fais:

char* extension

extension = "txt";

sprintf(buff, "(*.%s)\0*.%s\0\0", extension, extension);



je m'attends à ce que buff contienne "(*.txt).txt"... mais voilà, il n'a que "(*.txt)"!



Quelqu'un peut m'expliquer??



Merci d'avance,

myrion

11 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 mars 2005 à 08:55
// on remplace les caractères '|' par des caractères '\0'.
LPTSTR pChar = szFilter;
while((pChar = _tcschr(pChar, '|')) != NULL)
*pChar++ = '\0';
3
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005
2 mars 2005 à 18:19
j'oubliais: j'initialise buff ainsi: char buff[255] = {0};
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
2 mars 2005 à 18:43
Que vient fait le \0, si je me trompe pas il indique la fin d'une chaine. Tout char * est une chaine de caractere qui se termine par le caractere nul. Donc lorsque la valeur est lu est est lu jusqu'au permier \0 trouvé normal.

Il faut voir ta variable comme ca char * buff[255] et tu lis char [0] et char[1] qui donne :
char [0] = (*.txt) et char[1]=*.txt
0
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005
2 mars 2005 à 18:50
Merci pour ta réponse



En fait, je veux choisir un type d'extension autorisé pour sauvegarder un fichier.



Si c'est un txt à tous les coups, je peux mettre sOpenFile.lpstrFilter
= "File (*.txt)\0*.txt\0\0"; et tout beigne, mais là, l'extension est
donnée en paramètre...
0

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

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 mars 2005 à 19:11
A la place de '\0', met un caractère comme '|'. Formate ton filtre des extensions puis remplace les '|' par des '\0'.
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
2 mars 2005 à 19:13
La desolé je peux plus t'aider sOpenFile.lpstrFilter je connais pas.
Les \0 me laisse perplexe mais je connais pas cette structure.
Eventuellement donne plus d'info mais je suis pas sure de pouvoir t'aider pour la suite.

Bon courrage
0
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005
2 mars 2005 à 19:16
Me suis trompé! sOpenFile c'est OPENFILENAME



Voici un bout de la structure (j'ai du trouver ça sur ce site d'ailleur)



OPENFILENAME sOpenFile;

char szPath[MAX_PATH + 1];

BOOL bRet;

HWND hCtrl;

int i;

char* buff = NULL;



szPath[0] = '\0';



//Initialise la structure

ZeroMemory(&sOpenFile,sizeof(OPENFILENAME));

sOpenFile.lStructSize = sizeof(OPENFILENAME);

sOpenFile.hwndOwner = hParent;



// choix des extensions

if(extension == 0)

sOpenFile.lpstrFilter = "File (*.*)\0*.*\0\0";

if(extension == 1)

sOpenFile.lpstrFilter = "Bitmap (*.bmp)\0*.bmp\0\0";



sOpenFile.nFilterIndex = 1;

sOpenFile.lpstrFile = szPath;

sOpenFile.nMaxFile = MAX_PATH + 1;

sOpenFile.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST |

((bOpen)? OFN_FILEMUSTEXIST : OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT);



...



Mon but est d'avoir en paramètre l'extension qui va dans sOpenFile.lpstrFilter = "File (*.*)\0*.*\0\0";
0
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005
2 mars 2005 à 20:11
Salut ymca2003,



Si je fais ce que tu me dis, j'ai :

sprintf(buff,"(*.%s)|*.%s||",ext,ext);

for (i=0;i<strlen(buff);i++){

if (buff[i] == '|') buff[i] = '\0';}

sOpenFile.lpstrFilter = buff;



Mais ça change rien au problème!



Si je regarde sur msdn (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/

commondialogboxlibrary/commondialogboxreference/commondialogboxstructures/openfilename.asp) il est dit pour lpstrFilter : "
Pointer to a buffer containing pairs of null-terminated filter strings." Donc j'échappe pas à \0



Il doit donc bien y avoir un truc pour passer en paramètre des retour de ligne (\0) ?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
3 mars 2005 à 08:56
szFilter est bien sûr le filtre formatté avec des '|' (ne pas oublier d'en mettrre un à la fin pour avoir 2 '\0' au final.
_tcschr est équivalent à strchr.
0
yserver Messages postés 203 Date d'inscription lundi 2 août 2004 Statut Membre Dernière intervention 8 septembre 2006
3 mars 2005 à 09:15
Merci de ta reponse ymca2003
slts
0
cs_myrion Messages postés 21 Date d'inscription mercredi 2 février 2005 Statut Membre Dernière intervention 7 décembre 2005
3 mars 2005 à 09:46
Super, merci! J'ai juste du légèrement modifier, mais c'est ce que je cherchais!



Merci
0
Rejoignez-nous