Sprintf récalcitrant [Résolu]

Signaler
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005
-
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005
-
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

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
// on remplace les caractères '|' par des caractères '\0'.
LPTSTR pChar = szFilter;
while((pChar = _tcschr(pChar, '|')) != NULL)
*pChar++ = '\0';
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005

j'oubliais: j'initialise buff ainsi: char buff[255] = {0};
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

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
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005

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...
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
A la place de '\0', met un caractère comme '|'. Formate ton filtre des extensions puis remplace les '|' par des '\0'.
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

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
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005

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";
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005

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) ?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
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.
Messages postés
203
Date d'inscription
lundi 2 août 2004
Statut
Membre
Dernière intervention
8 septembre 2006

Merci de ta reponse ymca2003
slts
Messages postés
21
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
7 décembre 2005

Super, merci! J'ai juste du légèrement modifier, mais c'est ce que je cherchais!



Merci