[C] enregistrement dans un repertoire non defini d'avance possible?

enregistrement dans un repertoire non defini d'avance possible? [C] - C++ - Programmation

Marsh Posté le 05-10-2002 à 12:47:03    

Bonjour,
je fais un pgm qui utilise les fichiers et j'aimerais, apres saisis de ceci, les enregistrer soit sur une DK, soit de le repertoire courant(bon ca je sais faire :)) soit dans un repertoire que l'utilisateur donneras... c'est possible? et si oui comment faire?
peut on egalement faire saisir par l'utilisateur l'adresse ou devra s'enregistrer le fichier et si le ou les repertoires n'existes pas les creer?
 
apres coment on peut faire pour appeler un fihier qui ne se trouve pas dans le repertoire courant?
 
Ca fais beaucoup de questions...  :sweat:  :sweat:  :sweat:  
 
merci de votre aide  ;)

Reply

Marsh Posté le 05-10-2002 à 12:47:03   

Reply

Marsh Posté le 05-10-2002 à 12:51:41    

fais attention: la notion de répertoire n'existe pas en C. suivant ta plateforme tu devras faire des appels systemes pour créer et/ou parcourir des répertoires


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 05-10-2002 à 13:00:28    

Taz@PPC a écrit a écrit :

fais attention: la notion de répertoire n'existe pas en C. suivant ta plateforme tu devras faire des appels systemes pour créer et/ou parcourir des répertoires




merci de me le dire je ne le savais pas...
tu pourrais etre plus precis ou alors m'indiquer un lien ou je pourrais avoir c renseignements? merci beaucoup

Reply

Marsh Posté le 05-10-2002 à 15:56:56    

quelle plateforme? ca dépend de ton système


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 05-10-2002 à 18:37:01    

Taz@PPC a écrit a écrit :

quelle plateforme? ca dépend de ton système




windows (xp si ca change qqchose...)

Reply

Marsh Posté le 05-10-2002 à 19:04:42    

ben chai pas alors...


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 05-10-2002 à 23:56:46    

Comme te l'as dit Taz, il va falloir faire appel a des fonctions propres a Windows.
Ca releve plus de la programmation Windows que du C.
Une solution elegante pour tout regler d'un coup est d'ouvrir une boite "Enregistrer sous ..." qui va permettre a l'utilisateur soit de :
- choisir la disquette
- garder le repertoire courant
- aller dans le repertoire voulu  
- creer son propre repertoire
 
Toi tu t'occupes juste de lancer la boite de dialogue et de récupérer le chemin valide qu'elle va te retourner (en fonction de ce qu'a choisi l'utilisateur)
 
La boite de dialogue enregistrer sous (Save As) fait partie des "commons dialog" (y'en a d'autres telle que Ouvrir, Imprimer, ...)
 

Code :
  1. int EnregistrerSous(char * Name, int Size)
  2. {
  3. /*
  4.    Renvoit TRUE si un nom de fichier a été donné (click sur OK)
  5.    FALSE si l'utilisateur a annulé ou s'il il y a eu une erreur
  6.    Name contient le nom complet valide (avec le chenmin)
  7. */
  8.     OPENFILENAME ofn;
  9.     ZeroMemory(&ofn, sizeof(ofn)); // tout initialiser a zero
  10.     ofn.lStructSize = sizeof(OPENFILENAME);
  11.     ofn.lpstrFile = Name;
  12.     ofn.nMaxFile = Size;
  13.     ofn.Flags = OFN_PATHMUSTEXIST |  // chemin valide
  14.                 OFN_OVERWRITEPROMPT; // demander avant de remplacer un fichier existant
  15.     return GetSaveFileName(&ofn);
  16. }
  17. #define MAX_SIZE 200
  18. int main()
  19. {
  20.     char path[MAX_SIZE] = "nom par defaut.txt";
  21.     if (EnregistrerSous(path, MAX_SIZE) != 0)
  22.     {
  23.         // path contient le nom + chemin complet du fichier a creer
  24.     }
  25.     return 0;
  26. }


 

Citation :

apres coment on peut faire pour appeler un fihier qui ne se trouve pas dans le repertoire courant?


 
Ben en donnant son nom complet ...
Tu es dans C:\Repertoire1
Tu veux ouvrir le fichier fic1 dans C:\repertoire2
=> tu fais fopen("C:\\Repertoire2\\fic1", "rb" );


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-10-2002 à 00:00:26    

J'oubliais ... un petit
#include <windows.h>
pour que ca marche.
Pour connaitre tous les styles possibles de la boite :
http://msdn.microsoft.com/library/ [...] LENAME.asp


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-10-2002 à 21:13:42    

HelloWorld a écrit a écrit :

J'oubliais ... un petit
#include <windows.h>
pour que ca marche.
Pour connaitre tous les styles possibles de la boite :
http://msdn.microsoft.com/library/ [...] LENAME.asp



merci beaucoup j'essairais ca tres bientot

Reply

Marsh Posté le 06-10-2002 à 22:52:51    

HelloWorld a écrit a écrit :

Comme te l'as dit Taz, il va falloir faire appel a des fonctions propres a Windows.
Ca releve plus de la programmation Windows que du C.
Une solution elegante pour tout regler d'un coup est d'ouvrir une boite "Enregistrer sous ..." qui va permettre a l'utilisateur soit de :
- choisir la disquette
- garder le repertoire courant
- aller dans le repertoire voulu  
- creer son propre repertoire
 
Toi tu t'occupes juste de lancer la boite de dialogue et de récupérer le chemin valide qu'elle va te retourner (en fonction de ce qu'a choisi l'utilisateur)
 
La boite de dialogue enregistrer sous (Save As) fait partie des "commons dialog" (y'en a d'autres telle que Ouvrir, Imprimer, ...)
 

Code :
  1. int EnregistrerSous(char * Name, int Size)
  2. {
  3. /*
  4.    Renvoit TRUE si un nom de fichier a été donné (click sur OK)
  5.    FALSE si l'utilisateur a annulé ou s'il il y a eu une erreur
  6.    Name contient le nom complet valide (avec le chenmin)
  7. */
  8.     OPENFILENAME ofn;
  9.     ZeroMemory(&ofn, sizeof(ofn)); // tout initialiser a zero
  10.     ofn.lStructSize = sizeof(OPENFILENAME);
  11.     ofn.lpstrFile = Name;
  12.     ofn.nMaxFile = Size;
  13.     ofn.Flags = OFN_PATHMUSTEXIST |  // chemin valide
  14.                 OFN_OVERWRITEPROMPT; // demander avant de remplacer un fichier existant
  15.     return GetSaveFileName(&ofn);
  16. }
  17. #define MAX_SIZE 200
  18. int main()
  19. {
  20.     char path[MAX_SIZE] = "nom par defaut.txt";
  21.     if (EnregistrerSous(path, MAX_SIZE) != 0)
  22.     {
  23.         // path contient le nom + chemin complet du fichier a creer
  24.     }
  25.     return 0;
  26. }


 

Citation :

apres coment on peut faire pour appeler un fihier qui ne se trouve pas dans le repertoire courant?


 
Ben en donnant son nom complet ...
Tu es dans C:\Repertoire1
Tu veux ouvrir le fichier fic1 dans C:\repertoire2
=> tu fais fopen("C:\\Repertoire2\\fic1", "rb" );
 




 
salut,
je n ai rien a voir avec ce topic mais j ai essayé de compilé ton source avec devc++ et y a 0 erreur 0 warning
mais aucun executable n est généré c normale?
 

Reply

Marsh Posté le 06-10-2002 à 22:52:51   

Reply

Marsh Posté le 07-10-2002 à 15:55:33    

Heu non c'est pas normal, car je l'ai moi aussi teste avant de le mettre et je l'ai teste avec ... devcpp.
Moi j'ai la version 4.
J'ai recement eu ce probleme d'exe non genere, c'etait hier quand j'ai fait generer le code asm de mon prog en ajoutant l'option -S dans les parametres supplementaires.
J'ai vire cet ajout et tout est rentre dans l'ordre.
Tant que j'y suis : il marche bien toi devcpp ?
Moi j'ai installe le 5 beta et il refuse de compiler.
Quant au 4, il plante regulierement au bout d'un certains nombre de sauvegardes de mon source (a chaque sauvegarde, la memoire utilisee par devcpp augmente !).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-10-2002 à 16:02:06    

HelloWorld a écrit a écrit :

Heu non c'est pas normal, car je l'ai moi aussi teste avant de le mettre et je l'ai teste avec ... devcpp.
Moi j'ai la version 4.
J'ai recement eu ce probleme d'exe non genere, c'etait hier quand j'ai fait generer le code asm de mon prog en ajoutant l'option -S dans les parametres supplementaires.
J'ai vire cet ajout et tout est rentre dans l'ordre.
Tant que j'y suis : il marche bien toi devcpp ?
Moi j'ai installe le 5 beta et il refuse de compiler.
Quant au 4, il plante regulierement au bout d'un certains nombre de sauvegardes de mon source (a chaque sauvegarde, la memoire utilisee par devcpp augmente !).




 
salut,
 alors pour repondre a tes questions:
 
j ai devc++ 4 jl ai instalé la semaine derniere et sous windows 2000 ca tourne normalement, jpeux rien dire de + puisque c 'est avec ton programme que je l ai utilisé pour la premiere fois  :D  
 
sinon je pense que ce serait bien de faire part aux programmeurs du projet les problemes que tu as rencontrés...  
 
 
sinon pour finir je trouve pas l option que tu m'as demandé d enlever :/
 
edit : j ai ce message qui apparait mais jle comprend pas :
C:\DOCUME~1\ADMINI~1.LOC\LOCALS~1\Temp\cci4aaaa.o(.text+0x3b):file.c: undefined reference to `GetSaveFileNameA@4'
 


Message édité par veryfree le 07-10-2002 à 16:07:17
Reply

Marsh Posté le 09-10-2002 à 13:01:32    

Ah ok ok je vois ...
Effectivement j'ai eu cette erreur, c'est parce qu'il faut ajouter une lib (celle qui contient la fonction GetSaveFileNameA, d'ou l'erreur car il est incapable de trouver ou c'est defini)
Cette fonction est il me semble contenue dans comdlg32.dll
donc faut inclure une lib qui doit vraissemblablement avoir comme nom comdlg32.lib


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-10-2002 à 21:46:20    

HelloWorld a écrit a écrit :

Ah ok ok je vois ...
Effectivement j'ai eu cette erreur, c'est parce qu'il faut ajouter une lib (celle qui contient la fonction GetSaveFileNameA, d'ou l'erreur car il est incapable de trouver ou c'est defini)
Cette fonction est il me semble contenue dans comdlg32.dll
donc faut inclure une lib qui doit vraissemblablement avoir comme nom comdlg32.lib




 
j ai reussi a trouver comdlg32.dll par contre comdlg32.lib :/
 
j ai pris comdlg32.dll jl ai mise ds winnt/system32 et ca na rien changer  
jdoit mal m y prendre :/

Reply

Marsh Posté le 10-10-2002 à 01:16:12    

Je voulais juste indiquer un truc:

Code :
  1. GetSaveFileName()  //nom utilisé dans le source
  2. GetSaveFileNameA() //fonction appelée pour un environnement ANSI/ASCII
  3. GetSaveFileNameW() //fonction appelée pour un environnement Unicode (W comme Wide char)


GetSaveFileName est en fait une macro se tournant vers l'une ou l'autre version selon le contexte de compilation.
Des macros supplémentaires se chargent de convertir les chaînes passées en argument au besoin.
 
Windows 95, 98, 98SE sont ANSI natifs.
Windows NT, 2000, XP sont Unicode natifs.
 
Donc, l'environnement pour lequel on compile pourrait affecter la fonction recherchée.
Si il n'y a pas la bonne librairie derrière, ça ne marchera pas.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 10-10-2002 à 13:11:02    

La dll ca n'a rien a voir.
Tu ne dois pas y toucher (a ton system32) car cette dll existe deja et de toute facon le probleme n'est pas la.
Le probleme c'est que ton programme doit appeler une fonction qui se trouve dedans (GetSaveFileNameA) et que le compilateur est incapable de savoir comment faire pour appeler cette fonction, c.a.d qu'il ne sait pas dans quelle dll elle se trouve.
Cette info est contenue dans un .lib, je ne sais pas lequel (j'ai pas devccp sous la main la).
Tu peux faire une recherche "*.lib contenant texte GetSaveFileNameA" et tu devrait avoir le nom de la lib.
Tu la rajoutes a ton projet.
Si tu ne la trouve pas (bizarre tout de meme), il va falloir faire a la main ce que le compilo est incapable de faire automatiquement pour toi, c'est a dire charger la dll (LoadLibrary) et recuperer un pointeur sur la fonction GetSaveFileNameA (GetProcAddress).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 10-10-2002 à 13:48:30    

HelloWorld a écrit a écrit :

La dll ca n'a rien a voir.
Tu ne dois pas y toucher (a ton system32) car cette dll existe deja et de toute facon le probleme n'est pas la.
Le probleme c'est que ton programme doit appeler une fonction qui se trouve dedans (GetSaveFileNameA) et que le compilateur est incapable de savoir comment faire pour appeler cette fonction, c.a.d qu'il ne sait pas dans quelle dll elle se trouve.
Cette info est contenue dans un .lib, je ne sais pas lequel (j'ai pas devccp sous la main la).
Tu peux faire une recherche "*.lib contenant texte GetSaveFileNameA" et tu devrait avoir le nom de la lib.
Tu la rajoutes a ton projet.
Si tu ne la trouve pas (bizarre tout de meme), il va falloir faire a la main ce que le compilo est incapable de faire automatiquement pour toi, c'est a dire charger la dll (LoadLibrary) et recuperer un pointeur sur la fonction GetSaveFileNameA (GetProcAddress).




 
merci pour toute ces explications c plus claitr pour moi maintenant!
 
en fait je debute en c/c++  
 
jregarde tout ca des que je peux
 
 
 :hello:

Reply

Marsh Posté le 10-10-2002 à 19:45:18    

la lib c'est libcomdlg32.a (gcc utilise .a comme extension et pas .lib) et elle se trouve dans le repertoire lib de ton install de devcpp
Pour l'ajouter a ton projet, dans le menu project option, ajoute la dans "further object files" (localise la a partir du bouton ouvrir a cote)
good luck !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed