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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 !

  2. #2
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    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.

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    735
    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 : 735
    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.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    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 487
    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 éclairé
    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
    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.

  6. #6
    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
    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

+ 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