IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

ouverture de fichier --> Choix de l'utilisateur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut ouverture de fichier --> Choix de l'utilisateur
    Bonjour à tous !

    Toujours pour le même programme, j'ai encore une question...

    Je faisais mes tests sur un fichier nommé fichier.txt dans le répertoire courant du programme.

    Mon programme est en console.

    J'aimerais que l'utilisateur puisse choisir le fichier qu'il veut traiter... Mais comme il y en aura certainement beaucoup, je ne veux pas qu'il s'embête à taper le nom entier du fichier...d'autant plus qu'il est chiant à taper...

    Donc, est-ce possible, en console, d'ouvrir une fenetre pour choisir son fichier?
    Ou alors, est-ce possible de traiter tous les fichiers avec une certaine extension qui sont dans le répertoire courant...
    (Exemple: Je veux traiter tous les fichiers texte qui se trouvent dans le répertoire du programme.)

    Merci d'avance

    Philippe

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par défaut
    Avec Win XP une application console peut utiliser des boîtes de dialogues (fonction GetOpenFileName de l'API). Pour les autres versions je ne sais pas.

    Si le programme n'est pas trop interactif, le plus simple serait de passer le nom des fichiers à traiter dans la ligne de commande ; ainsi la commande "programme *.txt" traitera tous les fichiers .txt.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Je suis intéressé par ta fonction GetOpenFileName, pourrais tu me donner un exemple?

    Sinon, je suis aussi intéressé par l'autre méthode, mais dans ce cas, j'ai une autre question:

    Comment faire pour passer un paramètre lors de l'execution du programme???
    Pour faire, comme tu le dis, un truc du style:
    programme *.txt

    Comment faire pour qu'il comprenne ca...
    Actuellement, mon fopen est le suivant: f = fopen("monfichier","r");

    Je suis impatient de voir ta réponse !!! lol

    Merci

    Philippe

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par défaut
    Toute la documentation de l'API windows est en ligne sur msdn.microsoft.com.
    J'ai copié-collé (et légèrement modifié) leur exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    	OPENFILENAME ofn;       // common dialog box structure
    	char szFile[260];       // buffer for file name
    	HWND hwnd = NULL; // j'ai mis NULL : pas de propriétaire
    	HANDLE hf;              // file handle
     
    	// Initialize OPENFILENAME
    	ZeroMemory(&ofn, sizeof(ofn));
    	ofn.lStructSize = sizeof(ofn);
    	ofn.hwndOwner = hwnd;
    	ofn.lpstrFile = szFile;
    	//
    	// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    	// use the contents of szFile to initialize itself.
    	//
    	ofn.lpstrFile[0] = '\0';
    	ofn.nMaxFile = sizeof(szFile);
    	ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    	ofn.nFilterIndex = 1;
    	ofn.lpstrFileTitle = NULL;
    	ofn.nMaxFileTitle = 0;
    	ofn.lpstrInitialDir = NULL;
    	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
     
    	// Display the Open dialog box.
     
    	if (GetOpenFileName(&ofn)==TRUE)
    	  hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
    	      0, (LPSECURITY_ATTRIBUTES) NULL,
    	      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
    	      (HANDLE) NULL);
    Pour résumer :
    * initialiser un objet de type OPENFILENAME
    * appeler GetOpenFileName
    * si la fonction ne renvoie pas 0, le nom des fichiers sélectionnés se trouve dans le champ lpstrFile


    Pour utiliser la ligne de commande (ce qui serait mieux et même portable), il faut modifier la fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    int main(int argc, char *argv[]) {
     // argv[0] contient le nom du programme
     // argv[1] contient le premier paramètre
     // ...
     // argv[argc-1] contient le dernier paramètre
     for (int i=1;i<argc;++i) {
      fopen(argv[i]);
      //...
     }
    }
    Quand il n'y a pas de paramètre, argc vaut 1.
    La boucle for n'est pas obligatoire, mais il faut s'assurer que des paramètres ont bien été passés (argc>1).
    Avec le caractère '*', le système va appeler le programme pour chaque fichier .txt rencontré.
    La FAQ C explique tout ça.

    Sous windows, il n'y a plus qu'à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    C:\repertoire>programme.exe *.txt
    Je pense que sous linux ça doit être pareil.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Bonjour, merci pour ton code, je vais tester ca des ce soir, des que je rentre...

    Je serais contraint (et forcé) de revenir sous windows, mais je le ferai...
    lol

    je connaissais cette API sous VB (je faisais ca avant), mais pas en c++...

    Je teste, et je vous tiens au courant.

    Merci

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 113
    Par défaut
    Bon, je viens de tester les méthodes...

    La deuxième, pas de pb, ca marche nickel, pour la première par contre, je ne sais pas comment faire...
    Je débute en C++ (enfin, depuis le mois de septembre), et comme on taf sous linux, je n'ai pas ca.. Alors je sais pas comment faire...

    Pourrais tu me donner un exemple?
    Tu es sur que ca marche une boite de dialogue quand on lance le prog en console?

    Merci !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par défaut
    Voici un exemple complet (fichier main.cpp) compilé avec Dev-Cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <windows.h>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
    	OPENFILENAME ofn;       // common dialog box structure
    	char szFile[260];       // buffer for file name
    	HWND hwnd = NULL; // j'ai mis NULL : pas de propriétaire
     
    	// Initialize OPENFILENAME
    	ZeroMemory(&ofn, sizeof(ofn));
    	ofn.lStructSize = sizeof(ofn);
    	ofn.hwndOwner = hwnd;
    	ofn.lpstrFile = szFile;
    	//
    	// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    	// use the contents of szFile to initialize itself.
    	//
    	ofn.lpstrFile[0] = '\0';
    	ofn.nMaxFile = sizeof(szFile);
    	ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    	ofn.nFilterIndex = 1;
    	ofn.lpstrFileTitle = NULL;
    	ofn.nMaxFileTitle = 0;
    	ofn.lpstrInitialDir = NULL;
    	ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
     
    	// Display the Open dialog box.
     
    	if (GetOpenFileName(&ofn)) {
    		ifstream infile(ofn.lpstrFile);
    		cout << infile.rdbuf();
    		infile.close();
    	}
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    Ne pas oublier d'ajouter -lcomdlg32 dans le menu Project/Project options/Parameters/Linker.

    J'ai WinXP et quand je lance le programme, une boîte de dialoque m'invite à choisir un fichier, puis le programme affiche son contenu dans la console (choisir un fichier texte).

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par z980x
    je connaissais cette API sous VB (je faisais ca avant), mais pas en c++...
    Ben ouais. C'est l'API win32 qui ne concerne en rien le C++
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Choix d'opération à l'ouverture du fichier
    Par ElPibeOro dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/04/2012, 16h22
  2. Réponses: 1
    Dernier message: 07/06/2011, 13h26
  3. [XL-2000] choix d'ouverture de fichier texte
    Par kev159 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/09/2010, 10h40
  4. Inno Setup: Installer certains fichiers suivant le choix de l'utilisateur
    Par remfleyf dans le forum Installation, Déploiement et Sécurité
    Réponses: 3
    Dernier message: 17/12/2008, 10h55
  5. Message lors ouverture du fichier par un autre utilisateur
    Par Merlin_02 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 24/01/2008, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo