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 :

Problème ouverture fichier dans en utilisant visual studio 10 C++


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Problème ouverture fichier dans en utilisant visual studio 10 C++
    Bonjour,

    J'utilise un code en C++ pour ouvrir un fichier et lire son contenu.
    Le code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ifstream inFile;
      inFile.open("Pat6.rcp", ios ::in);
      if(!inFile)
        {
          cout<<"Probleme d'ouverture du fichier "<< endl;
          exit(1);
        }
      //Lire 1er element de la 1ere ligne du fichier (nombre de noeuds)
      inFile >> n;
    Le problème c'est que en essayant d’exécuter ce code dans un projet C++ en utilisant Visual Studio 10 C++ il n'arrive pas à ouvrir le fichier, il m'afficher toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Probleme d'ouverture du fichier
    Alors qu'en utilisant g++ sous UNIX j'arrive à exécuter ce code et à ouvrir le fichier.

    Je suis perdu car je vois pas d’où vient l'erreur sous Visaul studio 10.
    Je vous remercie de votre aide.

    Nadia

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ton code utilise un chemin de fichier relatif. As-tu vérifié le répertoire d'exécution?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Je vous remercie pour votre réponse.
    En fait, comme je viens de commencer dernièrement à utiliser visual studio sous windows je connais pas grand chose.
    Est ce que je dois mettre le fichier a ouvrir dans le dossier qui contient le projet ? (chose que j'ai faite) ou est ce que je dois définir le chemin d’accès dans le code C++?
    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Le plus simple: Utiliser la fonction _getcwd() pour faire afficher le répertoire de travail par le programme lui-même, mettre le fichier dans ce répertoire.

    Sinon: Dans les propriétés du projet, le plus souvent à l'onglet Debugging, il doit y avoir une section "répertoire de travail" pour dire dans quel répertoire doit s'exécuter le programme quand on le lance depuis Visual.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Autre question
    Je vous remercie pour votre réponse.
    Donc a ce que j'ai compris je dois mettre le fichier a lire dans ce répertoire de travail que je trouve avec _getcwd()?

    J'ai une autre question s'il vous plaît, j'ai un soucis avec l'affichage du résultat en console, en effet la console apparait pour quelques secondes puis disparait.
    D'habitude j'arrive en utilisant getchar() de la faire apparaitre d'une façon permanente mais ça marche plus.
    Comment dois-je procéder ?
    Merci

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Si ça disparaît même avec getchar(), c'est que ton buffer clavier n'est pas vide quand du l'atteint.
    Généralement, c'est parce que tu n'as pas fini de lire la ligne en cours, soit suite à un scanf("%d"), soit suite à un fgets() où l'utilisateur a tapé plus que ton buffer pouvait accepter.

    La solution, c'est une fonction pour finir de lire la ligne en cours. On la trouve souvent sur le forum, généralement sous le nom fpurge().

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si dans les options, la propriété correspondant au répertoire d'exécution est vide, par défaut, ça doit être le répertoire où se trouve ton fichier .vcxproj.

    Sinon, pour garder la fenêtre ouverte après la fin de l'exécution, une solution est de lancer le programme par Ctrl-F5 (run) et non pas F5 (debug). ou alors de mettre un breakpoint sur la dernière ligne si tu le lances avec F5.

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Si dans les options, la propriété correspondant au répertoire d'exécution est vide, par défaut, ça doit être le répertoire où se trouve ton fichier .vcxproj.

    Sinon, pour garder la fenêtre ouverte après la fin de l'exécution, une solution est de lancer le programme par Ctrl-F5 (run) et non pas F5 (debug). ou alors de mettre un breakpoint sur la dernière ligne si tu le lances avec F5.
    Je vous remercie pour votre réponse. Effectivement, lancer le programme avec Ctrl-F5 résout le problème d'une manière assez simple.
    Concernant le fichier en lecture, le problème que j'ai placé le fichier dans le répertoire ou se trouve le .vcxproj mais toujours même résulta.
    Le programme n'affiche aucune erreur lors du run mentionnant qu'il n'a pas trouvé le fichier en lecture mais en sortie console le test d'ouverture du fichier échoue. En testant sous linux je le mets la ou il y a le makefile et ça marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     ifstream inFile;
      inFile.open("Pat6.rcp", ios ::in);
      if(!inFile)
        {
          cout<<"Probleme d'ouverture du fichier "<< endl;
          exit(1);
        }
    Est ce que je dois indiquer le path du fichier en l'appelant ?

    Je vous remercie d'avance.

  9. #9
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Bonjour,

    As-tu essayé de mettre Pat6.rcp dans le dossier Debug où se trouve l'exécutable de ton projet ? Si tu le spécifies sans donner son répertoire, c'est que Visual Studio doit le considérer comme appartenant au répertoire de ton exécutable non ?

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le plus simple: Utiliser la fonction _getcwd() pour faire afficher le répertoire de travail par le programme lui-même, mettre le fichier dans ce répertoire.

    Sinon: Dans les propriétés du projet, le plus souvent à l'onglet Debugging, il doit y avoir une section "répertoire de travail" pour dire dans quel répertoire doit s'exécuter le programme quand on le lance depuis Visual.
    Bonjour,
    En utilisant la fonction _getcwd() de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //Trouver le repertoire de travail pour exécution
    	char *buffer;
        //Get the current working directory
        if( (buffer = _getcwd( NULL, 0 )) == NULL)
            perror("_getcwd error");
        else
        {
            printf("%s \n", buffer);
        }
    Le code me retourne le répertoire de travail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\...\Desktop\ProjetMILP\test\test
    Le problème c'est que en mettant le fichier a ouvrir dans ce répertoire il n'arrive pas a le lire non plus.
    Le code ne généré pas d'erreurs mais lors de l’exécution de ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream inFile;
      inFile.open("Pat6.rcp", ios ::in);
      if(!inFile)
        {
          cout<<"Probleme d'ouverture du fichier "<< endl;
          exit(1);
        }
    Le test d'ouverture échoue et la réponse est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Probleme d'ouverture du fichier
    Appuyez sur une touche pour continuer...
    A votre avis ça peut être du a quoi ?

    J'utilise le visual studion C++ 2010 version 64 bits sous windows 8 pour plus d'informations.

    Je vous remercie pour votre réponse.

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Jimmy91 Voir le message
    Bonjour,

    As-tu essayé de mettre Pat6.rcp dans le dossier Debug où se trouve l'exécutable de ton projet ? Si tu le spécifies sans donner son répertoire, c'est que Visual Studio doit le considérer comme appartenant au répertoire de ton exécutable non ?
    Oui je l'ai mis dans le debug ou se trouve l’exécutable mais la lecture échoue également lors du test d'ouverture dans le code ci-dessus.

  12. #12
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Salut,

    Ton erreur devrait provenir du fait que ta variable infile n'a pas été initialisée. Inutile de se servir de la fonction ifstream::open(char* filename), on peut directement passer le nom du fichier dans le constructeur, ce qui initialise ta variable et lui fait ouvrir le fichier d'un seul coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	std::ifstream* inFile = new std::ifstream("Pat6.rcp");
    	if (!inFile)
    		std::cout << "Problème lors de l'ouverture du fichier" << std::endl;
    	else
    		std::cout << "Le fichier a été chargé avec succès" << std::endl;
    Ne jamais oublier d'initialiser ses variables. J'en sais quelque chose, j'y ai perdu des après-midis

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    inFile dans le code de nadia_ept est un objet (avec un constructeur par défaut), et non un pointeur. Le code que tu proposes rend le test incorrect.

  14. #14
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Jimmy91 Voir le message
    Salut,

    Ton erreur devrait provenir du fait que ta variable infile n'a pas été initialisée. Inutile de se servir de la fonction ifstream::open(char* filename), on peut directement passer le nom du fichier dans le constructeur, ce qui initialise ta variable et lui fait ouvrir le fichier d'un seul coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	std::ifstream* inFile = new std::ifstream("test.txt");
    	if (!inFile)
    		std::cout << "Problème lors de l'ouverture du fichier" << std::endl;
    	else
    		std::cout << "Le fichier a été chargé avec succès" << std::endl;
    Ne jamais oublier d'initialiser ses variables. J'en sais quelque chose, j'y ai perdu des après-midis
    Je vous remercie énormément de votre réponse. Effectivement ça résout le problème et le fichier s'ouvre directement.
    Mais le problème c'est que j'ai utilisé cette façon de coder pour utiliser la variable infile pour lire les éléments du fichier un par un et les affecter à mes variables comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inFile >> n;
    inFile >> R;
    etc.

    Le problème c'est que avec la nouvelle façon le fichier s'ouvre bien mais la variable inFile est non reconnue et le code générè cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1>error C2296: '>>'*: non conforme, l'opérande gauche est du type 'std::ifstream *'
    1> error C2784: 'std::basic_istream<_Elem,_Traits> &std::getline(std::basic_istream<_Elem,_Traits> &,std::basic_string<_Elem,_Traits,_Alloc> &)'*: impossible de déduire l'argument modèle pour 'std::basic_istream<_Elem,_Traits> &' à partir de 'std::ifstream *'
    1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\string(479)*: voir la déclaration de 'std::getline'
    De même que std::getline qui est devenue méconnue par le code.

    Je suis débutante dans le codage C++ je suis un peu perdue.

  15. #15
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 103
    Points : 224
    Points
    224
    Par défaut
    Salut,

    Comme l'a dit Médinoc l'introduction d'un pointeur de ma part rend ton code incorrect, il faut donc l'adapter.

    Tu dois donc modifier tous tes appels à inFile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *inFile >> n;
    *inFile >> R; // Remarque : par convention, il ne faut pas commencer tes noms de variables par une majuscule...

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Et le test est toujours foiré.
    Code incorrect : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	std::ifstream* inFile = new std::ifstream("Pat6.rcp");
    	if (!inFile)
    		std::cout << "Problème lors de l'ouverture du fichier" << std::endl;
    	else
    		std::cout << "Le fichier a été chargé avec succès" << std::endl;
    Le problème de ceci est que if( !inFile ) sera toujours faux, parce que le pointeur inFile ne sera jamais nul. Pour savoir si une ouverture de fichier a marché, c'est l'objet flux qu'il faut tester, et non le pointeur vers lui.

    Résultat, le code va toujours croire que le fichier a été ouvert avec succès, qu'il ait raison ou non.

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Jimmy91 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	std::ifstream* inFile = new std::ifstream("Pat6.rcp");
    Pitié, pas d'utilisation gratuite de pointeurs !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ifstream inFile("Pat6.rcp");
    Est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ifstream inFile;
      inFile.open("Pat6.rcp", ios ::in);

  18. #18
    Membre à l'essai
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Points : 15
    Points
    15
    Par défaut Problème résolu
    Bonjour,
    Je vous remercie tous pour votre réponse. Le problème est bien résolu en utilisant directement la ligne de commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream inFile("Pat6.rcp.rcp", ios ::in);
    En effet, j'ai constaté une autre erreur qui est l'extension du fichier. Comme je générè ces fichiers de données directement sur RanGen de type .rcp ce dernier nomme les fichiers déjà avec l'extension "Pat6.rcp" (le nom du fichier) ce qui m'a induit en erreur en croyant que c'est l'extension du fichier alors que l'appelation complète du fichier sous windows est "Pat6.rcp.rcp" chose qui marchait bien sans soucis sous Linux.

    Merci

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 055
    Points
    33 055
    Billets dans le blog
    4
    Par défaut
    à savoir que préciser ios::in pour un istream est redondant et inutile

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utiliser MATLAB dans un IDE Visual Studio
    Par sdecorme dans le forum MATLAB
    Réponses: 2
    Dernier message: 02/10/2013, 07h08
  2. Utiliser GNU gettext dans un projet visual studio c++
    Par sentza dans le forum Débuter
    Réponses: 1
    Dernier message: 08/01/2012, 19h20
  3. Réponses: 1
    Dernier message: 02/03/2011, 20h29
  4. Installer un Web-Service (fichier executable) dans un site visual-Studio
    Par Tardiff Jean-François dans le forum Services Web
    Réponses: 3
    Dernier message: 13/12/2010, 15h30
  5. Réponses: 10
    Dernier message: 08/08/2008, 11h58

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