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 �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
    736
    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 : 736
    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 504
    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 504
    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

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

  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 : 51
    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
    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 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 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

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

+ 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