Problème avec cfiledialog (mfc -c++) [Résolu]

f14speedking 1 Messages postés mardi 26 juin 2012Date d'inscription 2 juillet 2012 Dernière intervention - 2 juil. 2012 à 17:11 - Dernière réponse : yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention
- 3 juil. 2012 à 13:39
Bonjour,

Débutant en programmation c++ mfc sous vc++08, j ’essaie de sauvegarder des données (entier et cstring)en ouvrant une fenêtre "enregistrer sous". Pour cela j'utilise Cfiledialog(true...
(code ci dessous).
Le code marche bien, mais je peut sauvegardé que dans le dossier du programme, pas ailleurs.


Quand je clique sur mon bouton "save" la boite "enregistrer sous" s'ouvre correctement, mais si je veux mettre mon fichier sur le bureau ou dans un dossier , sa sauvegarde mais pas à l'endroit ou j'ai choisi. La sauvegarde est faite dans le dossier du programme.

*Problème dans le code??

Comment faire pour je puisse sauvegardé dans un autre dossier?
j'ai beau cherché sur internet mais j'ai rien trouvé.

Je joins mon bout de code ci dessous :

void CtestDlg::OnBnClickedSavetext()

{
CFile f; //création fichier
char filtre_FilE[]= "Text Files(*.rtf)"; //filtre ici seul txt sélectionné

//données
CString nom;
CString prenom;
int age;
age=m_age.GetValue();
m_nom.GetWindowTextA(nom);
m_prenom.GetWindowTextA(prenom);

//conversion pour age
CString str_age;
str_age.Format(_T("%d"), age);

//creation fenetre openSave
CFileDialog fileDlg(FALSE, "rtf", 0,0,filtre_FilE);

//si appuis sur savetext go ouverutre en modal de saveBox)
if( fileDlg.DoModal() == IDOK)
{

CString Data;
Data=nom+"\n"+prenom+"\r\n"+str_age;

f.Open(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
CArchive ar(&f, CArchive::store);
ar <<Data;
ar.Close();

}
------------------
De plus j'ai un autre problème concernant le saut de ligne pour l'envoi des données vers un fichier comme bloc note, je me retrouve avec des caractères bizarres.
\r\n ne fonctionne pas pourtant normalement fonctionnable sous Windows et compréhensible pour bloc note d'après se que j'ai put voir sur internet.

*Ceux que j'ai essayé :
ar <<nom<<'\r'<<'\n'<<prenom; //saut de ligne mais présence caractères
ar <<nom<<'\r\n'<<prenom; //marche pas
Avec les guillemet "\r\n" non plus, bref avec la méthode du code en haut, cela règle à peut près le problème.

*Comment faire pour les saut de ligne sur un bloc note?

Voila merci encore.
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cs_louis14 788 Messages postés mardi 8 juillet 2003Date d'inscription 8 mars 2017 Dernière intervention - 3 juil. 2012 à 10:37
3
Merci
Bonjour,
juste pour ton nom de fichier , il faut utiliser GetPathName et non GetFileName pour avoir le nom et le répertoire de ta sélection.


louis

Merci cs_louis14 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_louis14
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 3 juil. 2012 à 13:39
0
Merci
Salut,

_T("") est une macros permettant d'avoir le bon encodage des chaines de caractères (unicode, multibytes ect...) selon ton paramétrage de projet.
Il faut donc l'utiliser pour TOUTES les chaines littérales sauf si le type char[] est utilisé.

_T("\r\n") // devrait marcher comme il faut


Pour ce qui est de MFC, utiliser GetPathName()

CString strFile(_T("x:\\chemin\\filedef.ext"));
char szFilters[] = "Text rtf (*.rtf)|*.rtf|";
char szExt[] = "rtf";
char szTitre[] = "Mon titre";
char szFileNameDef[256];
strcpy(szFileNameDef, (const char*)strFile);

CFileDialog dlg(
    FALSE,
    szExt,
    szFileNameDef,
OFN_LONGNAMES|OFN_NONETWORKBUTTON|OFN_HIDEREADONLY,
    szFilters,
    GetParent());

// Titre du dialog
OPENFILENAME& ofn = dlg.GetOFN();
ofn.lpstrTitle = szTitre;

if( dlg.DoModal()==IDOK )
{
    CFile fic;
    if( fic.Open((LPCTSTR)dlg.GetPathName(), CFile::modeCreate|CFile::modeWrite) )
    {
        //... Serialize(archive);
    }
}



bye...
Commenter la réponse de yann_lo_san

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.