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 :

Ecriture et lecture d'un fichier texte Linux/Windows


Sujet :

C++

  1. #1
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut Ecriture et lecture d'un fichier texte Linux/Windows
    Bonjour,
    Je souhaiterais pouvoir écrire le contenue d'une variable dans un fichier texte qui serait contenu dans le répertoire de l'exécutable. Le problème est que le seul moyen que je connaisse afin de détecter le répertoire de l'exécutable implique d'inclure des librairies qui n'appartiennent pas à l'OS, donc je ne peux pas déboguer et je souhaite n'avoir qu'un seul code. Ce que j'ai donc fait c'est détecter l'OS actuel et selon le cas stocker le fichier texte dans tel ou tel répertoire. Je teste actuellement sous Windows mais le fichier texte ne s'écrit pas sur le disque...
    Si quelqu'un voit le 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
    37
    38
    39
    40
    namespace
    {
    	unsigned HowMany = 23456;
    	unsigned BestScore = 0;
     
     
    	void ReadScore()
    	{
    		#ifdef __linux
    			ifstream fichier("/etc/opt/BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Linux
    		#elif _WIN64 || _WIN32
    			ifstream fichier("C:\BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Windows
    		#endif	
    		if (fichier)  // Si l'ouverture a réussi
    		{
    			fichier >> BestScore; // On lit le contenu du fichier et on le stock
    			fichier.close();  // On ferme le fichier
    		}
    		else  // Sinon
    			cerr << "Erreur à l'ouverture !" << endl;
    	}
     
    	void WriteScore()
    	{
    	#ifdef __linux
    		ofstream fichier("/etc/opt/BestScore.txt", ios::out | ios::trunc);  // Déclaration du flux et ouverture du fichier pour Linux
    	#elif _WIN64 || _WIN32
    		ofstream fichier("C:\BestScore.txt", ios::out | ios::trunc);  // Déclaration du flux et ouverture du fichier pour Windows
    	#endif
    		if (fichier)  // Si l'ouverture a réussi
    		{
    			fichier << HowMany; // On écrit le contenu de la variable
    			fichier.close();  // On referme le fichier
    		}
    		else  // Si c'est la première ouverture du programme, on crée le fichier ou si il est inaccessible
    			cerr << "Erreur à l'écriture !" << endl;
    		fichier << 0; 
    		fichier.close();  // On referme le fichier
    	}
    } // namespace
    Merci de votre aide !
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  2. #2
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Salut. Pourquoi ne pas utiliser l'argument 0 de lancement de l'application? Il n'y a pas de raison que le comportement change d'un OS à l'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(int argc, char **argv)
    {
        cout << "l'executable est:"<< argv[0] << endl;
        return 0;
    }
    Bien-sûr, il faudrait retrancher le nom de l'executable en fin de chaine et le remplacer par le nom du fichier texte.
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Bonsoir.

    Citation Envoyé par SkyZoThreaD Voir le message
    Il n'y a pas de raison que le comportement change d'un OS à l'autre.
    Probablement pas pour les OS les plus couramment utilisés, mais étant donné que le contenu d'argv[0] n'est pas standardisé, il se peux que certains systèmes « exotiques » en ont un différent.

    Citation Envoyé par CLeBeR Voir le message
    Je souhaiterais pouvoir écrire le contenue d'une variable dans un fichier texte qui serait contenu dans le répertoire de l'exécutable.
    Pourquoi chercher à passer par un chemin absolu ? Un chemin relatif est plus simple, non ?
    Cela dit, il faudra quand même faire attention aux problèmes de permissions d'écriture du dossier, et aux caractères spéciaux dans le nom du fichier.

    Mais si tu cherches vraiment des fonctionnalités plus poussés, et puisque la gestion des fichiers ne fait pas (encore*) partie du standard C++, tu devras passer par une bibliothèque externe pour faire les choses proprement (comme boost::filesystem).

    *l'ajout du module filesystem dans le standard est attendu pour C++14 ou C++17.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    CLeBeR, à la base, ton approche est bancale, sous Windows, on ne devrait jamais mettre de fichier en écriture ou en lecture dans le répertoire d'un exécutable, pour des problèmes évidents de sécurité, de paramétrage par utilisateur et pour le "roaming" des profiles utilisateurs.

  5. #5
    Membre habitué Avatar de CLeBeR
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 412
    Points : 188
    Points
    188
    Par défaut
    Bonjour,
    c'est vrai que c'est assez dépendant des autorisations disponibles sur le PC de l'utilisateur. De toute façon je n'utiliserai pas ce code finalement mais par curiosité, quelle aurait été la solution idéale selon vous ?
    De plus, j'ai écris le code suivant qui fonctionne sous Windows (en mode administrateur...) :
    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
    {
    	unsigned HowMany = 23456;
    	unsigned BestScore = 0;
     
     
    	void ReadScore()
    	{
    		ifstream fichier("BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Windows
    		if (fichier)  // Si l'ouverture a réussi
    		{
    			fichier >> BestScore; // On lit le contenu du fichier et on le stock
    			fichier.close();  // On ferme le fichier
    		}
    		else  // Sinon
    			cerr << "Erreur à l'ouverture !" << endl;
    	}
     
    	void WriteScore()
    	{
    		ofstream fichier("BestScore.txt", ios::out | ios::trunc);  // Déclaration du flux et ouverture du fichier pour Windows
    		if (fichier)  // Si l'ouverture a réussi
    		{
    			fichier << HowMany; // On écrit le contenu de la variable
    			fichier.close();  // On referme le fichier
    		}
    		else  // Si c'est la première ouverture du programme, on crée le fichier ou si il est inaccessible
    			cerr << "Erreur à l'écriture !" << endl;
    		fichier << 0; 
    		fichier.close();  // On referme le fichier
    	}
    Mais ne fonctionne pas sous Linux, voyez-vous d'où vient le problème ?
    Merci.
    Pensez à voter pour une réponse qui vous aide ou pour une personne insolente !
    Si votre sujet est résolu, cliquez sur le bouton !

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    je ne sais pas, mais dans writescore()
    si le fichier ne s'ouvre pas, (le if(fichier) echoue) après le else, tu écris quand meme dans le fichier, avant de le fermer.
    Ca ne peut pas marcher.
    C'est dommage de planter alors que tu prends la précaution de vérifier l'ouverture du fichier
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119

  8. #8
    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 : 49
    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
    Sinon, pour info, une erreur bête dans ton code initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			ifstream fichier("C:\BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Windows
    			ifstream fichier("C:\\BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Windows
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Sinon, pour info, une erreur bête dans ton code initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			ifstream fichier("C:\BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Windows
    			ifstream fichier("C:\\BestScore.txt", ios::in);  // On ouvre le fichier en lecture pour Windows
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ifstream fichier("C:/BestScore.txt");
    Marchera toujours, même sous windows.
    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...

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Même sous windows depuis au moins XP. Un 3.1 le refusera, et pour un 98, ce n'est pas sûr.
    Mais comme on ne travaille pas avec de si vieux os, normalement, il n'y a pas de risque
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/08/2007, 13h54
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 11h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 14h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 14h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 14h05

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