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

Langage C++ Discussion :

Indiquer des chemins avec fstream


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Par défaut Indiquer des chemins avec fstream
    Bonjour à tous,

    Un problème à s'arracher les cheveux... J'ai l'habitude de programmer en C++ avec vi et g++ sous Linux (oui, je sais, il y a mieux que vi...), et j'ai réalisé un petit programme qui marche impeccable sous Linux. J'ai voulu le passer sur Visual C++ sous Windows, tout compile mais il ne veut pas m'ouvrir ou lire un fichier avec fstream sauf si je code le chemin en dur dans le code. Impossible de le stocker dans un char *. Exemple :

    Cas qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ifstream fichier("C:/Users/Jerome/Documents/Visual Studio 2015/Projects/quiutilise/Debug/quiutilise.log", ios::app | ios::binary);
    	if (!fichier) { etc. pas exécuté, tout fonctionne}
    Cas qui ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char endur[200] = "C:/Users/Jerome/Documents/Visual Studio 2015/Projects/quiutilise/Debug/quiutilise.log";
     
    ifstream fichier(endur, ios::app | ios::binary);
    	if (!fichier) { etc. exécuté, il ne reconnaît pas le chemin !}
    J'ai tout essayé, les chemins relatifs avec juste "quiutilise.log", de remplacer les "/" par des "\" et des "\\", de protéger les espaces avec "\ ", bref, j'ai essayé à peu près tout, mais autant ça marche parfaitement sous Linux, autant, sous Windows, il n'accepte que le chemin en dur et pas dans une variable (sauf que ça doit être dans une variable car après je vais lire le chemin depuis un fichier).

    Merci pour votre aide.

    Jérôme.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 500
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 500
    Par défaut
    Le message d'erreur, SVP.

  3. #3
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    As-tu inspecté le contenu du bloc mémoire avant d'en passer l'adresse au constructeur d'ifstream ? As-tu reproduit ce comportement avec un programme minimal ?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    As-tu essayé d'utiliser un const char* plutôt qu'un char[] d'une taille arbitraire? (A tout hasard, on ne sait jamais.)

    Et surtout, pourquoi ne pas passer par une std:string? (et sa fonction c_str(), si tu ne compiles pas en C++11)

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Chez moi, le code suivant s'exécute sans problème :
    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
    // Testé avec GCC 6.3.0 sur Windows 7
     
    #include <iostream>
    #include <fstream>
     
    int main()
    {
    	{
    		std::ifstream ifs1("C:/test/test.txt", std::ios::app | std::ios::binary);
    		if(!ifs1) {
    			if(ifs1.bad())
    				std::cout << "ifs1 : bad\n";
    			else
    				std::cout << "ifs1 : fail\n";
    		}
    		char c1;
    		ifs1 >> c1;
    		std::cout << "ifs1 : lecture d'un caractere : " << c1 << '\n';
    	} // fermeture de ifs1
     
    	{
    		char fileName[] = "C:/test/test.txt";
    		std::ifstream ifs2(fileName, std::ios::app | std::ios::binary);
    		if(!ifs2) {
    			if(ifs2.bad())
    				std::cout << "ifs2 : bad\n";
    			else
    				std::cout << "ifs2 : fail\n";
    		}
    		char c2;
    		ifs2 >> c2;
    		std::cout << "ifs2 : lecture d'un caractere : " << c2 << '\n';
    	} // fermeture de ifs2
     
    	return 0;
    }
    Le mieux serait d'essayer de reproduire le bogue avec un bout de code simple.
    Ensuite, tu peux nous montrer le bout de code.

    Remarque : std::ios::app (app comme append), c'est pour écrire à la fin du fichier. Ça ne sert à rien avec un std::ifstream.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Par défaut
    Bon, merci à tous pour vos remarques, je m'en suis inspiré, j'ai mis un const, j'ai initialisé la chaine sans réservation, j'ai copié le code dans un nouveau projet, ça faisait pareil jusqu'à ce que... à un moment, je ne sais pas pourquoi, Visual studio m'a proposé de convertir les retours chariots Unix du code en retours chariots de type Windows (\r\n de mémoire). Et là, pouf, ça s'est mis à marcher ! Je pouvais toujours changer le code, c'était bêtement le passage de Linux à Windows qui fait qu'en manipulant des chaînes de caractères, il y avait des caractères que Visual studio ne comprenait pas.

    Merci encore.

    Jérôme.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Par défaut
    En fait, j'ai juste avancé d'une étape, je peux le mettre en dur dans le code, mais si je le lis le chemin complet depuis un fichier texte passé en paramètre, rebelote, il n'accède plus au fichier.

    Quand je fais un affichage, ça a l'air parfaitement similaire :

    C:/Users/Jerome/Documents/Visual Studio 2015/Projects/quiutilise/Debug/quiutilise.txt
    C:/Users/Jerome/Documents/Visual Studio 2015/Projects/quiutilise/Debug/quiutilise.txt

    (c'est le résultat d'un cout de mon const char * en haut avec lequel on peut lire le fichier via un ifstream, et la deuxième ligne celle qui passe par une autre variable char* et qui ne passe pas.

    Il doit y avoir une fin de caractère cachée qui fait qu'il n'accède pas au fichier. J'ai essayé de le convertir en ANSI avec Notepad++, en UTF8... En const char*, c'est bon, mais en le lisant depuis un fichier et avec un strcpy dans un char*, ça ne passe plus !

    Avez-vous des idées ?

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

Discussions similaires

  1. creer des dossiers avec fstream et mkdir()
    Par logs.49 dans le forum C++
    Réponses: 4
    Dernier message: 03/07/2008, 21h09
  2. Manipulation des fichiers avec fstream.
    Par Pragmateek dans le forum SL & STL
    Réponses: 4
    Dernier message: 04/04/2006, 13h12
  3. [DOS] Nom de chemin avec des blancs
    Par Sakalam dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 27/02/2006, 16h28
  4. Réponses: 8
    Dernier message: 20/01/2006, 13h46
  5. Gestion des chemins des images avec une base de données...
    Par Nean dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/07/2005, 08h08

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