C++ et Linux : utilisation de mkdir
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

C++ et Linux : utilisation de mkdir



  1. #1
    Aragorn_54

    C++ et Linux : utilisation de mkdir


    ------

    Bonjour à tous !

    Ne trouvant pas de solution malgré des recherches assez intensives sur le web, je viens vous exposer mon problème.

    Petit résumé de la situation, tout d'abord. L'année passée, j'ai écrit un programme de calcul en C++, celui-ci tournant sous Windows sans problème (j'utilisais, à l'époque, Visual C++).
    Cette année, j'aimerais continuer à travailler son code mais je suis maintenant amené à utiliser exclusivement Linux (Scientific Linux), système que je découvre peu à peu (pour la programmation, j'utilise un simple éditeur et g++) et j'ai rapidement découvert que certaines parties du code devaient être changées pour pouvoir tourner.
    Il ne me reste maintenant qu'un souci, à savoir régler le positionnement d'un dossier lors de sa création par le programme.

    Je m'explique :

    Dans mon programme, je demande la création de dossiers dans lesquels je positionne des fichiers, résultats de différents calculs. Pour cela, j'utilise

    Code:
    string commande("mkdir out1");
      int retour;
      retour = system(commande.c_str());
    	out1.open(".//out1//out.txt");
    qui est une version adaptée d'un forum. En clair, ceci demande l'exécution d'une commande propre à l'OS (à savoir "mkdir out1").

    Mon problème : le dossier est créé (c'est déjà ça ^^) mais pas dans le dossier où se trouve l'exécutable de mon programme (ce que je voudrais!) mais dans /home/monutilisateur :/..
    Comment puis-je lui dire d'utiliser le dossier où l'exécutable se trouve comme "pwd" (sans pour autant devoir écrire explicitement un chemin complet, solution peu élégante)?

    Je vous remercie d'avance pour vos conseils, commentaires ou liens vers d'éventuels tutoriaux explicites.

    Merci !

    Alex

    -----
    Dernière modification par Aragorn_54 ; 18/09/2007 à 10h52.

  2. #2
    lou_ibmix_xi

    Re : C++ et Linux : utilisation de mkdir

    Salut

    Il existe une commande "mkdir" en C posix ("man 2 mkdir" t'en dira plus). Il faut absolument éviter les appels au travers de la fonction "system", notamment pour des raisons de performance...

    Pourquoi faut il que le dossier à créer soit dans le répertoire de l'éxecutable, c'est contraire à la philosophie UNIX. Une solution plus UNIX est que tu crées un dossier portant le nom de ton éxecutable (éventuellement précéder d'un point si tu veux le cacher) dans le répertoire de l'utilisateur utilisant le programme. C'est comme cela que fonctionne tous les programmes du monde UNIX. La raison de cette méthode est (au moins) double, le programme a en général les droits de l'utilisateur l'appelant, et il est en général installé dans un dossier uniquement accessible en écriture par le super-utilisateur, donc les utilisateurs classiques appelant ton programme ne pourront pas créer de répertoire là où ton programme est installé. Enfin, UNIX est multi-utilisateur, cette méthode permet aux différents utilisateurs d'avoir différents paramètres de configuration pour le programme, et de faire tourner des instances en même temps en minimiseant les problèmes d'écrasement des fichiers créés...

    Encore une remarque, si tes fichiers sont temporaires, tu peux les faire dans un sous-dossier de "/tmp" qui doit être accessible à tous le monde en écriture, et utiliser les fonctions "mkdtemp" et "mktemp" ("man 3 mkdtemp" et "man 3 mktemp") pour générer des noms uniques à partir d'un patron.

    A plus

  3. #3
    le fatumbi

    Re : C++ et Linux : utilisation de mkdir

    Oui,
    Plus généralement, tu dois pouvoir exporter ce chemin (et autres config) dans la variable d'environnement qui va bien.
    Ca te permettra de configurer ton programme sans toucher aux sources.

    Ceci dit, -j'appuie Lou...- c'est quand même plus "dans le style linux" (logique, sécure...) de travailler dans le home de l'utilisateur ou dans /temps et non dans les dossiers programme: un repertoire racine pour ton appli dans home serait peut-être bienvenu ici (~/.mon_progr/out1)

  4. #4
    Aragorn_54

    Thumbs up Re : C++ et Linux : utilisation de mkdir

    Bonjour !

    Désolé pour ce délai assez conséquent ^^.. merci pour vos réponses.

    Finalement, il s'est avéré qu'il suffisait de taper "./out" (out est mon exécutable) dans la console pour que les dossiers soient créés là où je le désirais ça faisait ce que je voulais, c'était déjà ça.

    Mais bon, aujourd'hui, j'ai essayé de comprendre comment utiliser mkdir (plutôt que d'utiliser une commande système, suite à vos conseils) et, comme j'ai compris (c'est toujours tout bête quand on a trouvé), je viens expliquer son utilisation pour d'éventuels autres malheureux ^^ :

    Code:
    #include<iostream>
    
    #include<iomanip>
    
    #include<fstream>
    #include <sys/stat.h>
    #include <sys/types.h>
    
    int main(){
    
    	ofstream out1;
    	mkdir("out1", 01777); // ceci créera le dossier out1 là où l'exécution du programme aura lieu (si on fait ./nomdel'executable dans la console (de linux)), tout simplement.
    	out1.open(".//out1//out.txt"); // on met un fichier dans le dossier fraîchement créé.
    	out1 << "youpi"; // on remplit le fichier ^^
    
    	return 0;
    }
    RMQ : Le 01777, je l'ai tiré d'un sujet sur un autre forum où quelqu'un dit que c'est ça qu'il faut mettre comme mode ; je n'en sais pas +.

  5. A voir en vidéo sur Futura
  6. #5
    Aragorn_54

    Re : C++ et Linux : utilisation de mkdir

    J'ai décidé de donner une version qui fonctionnait exactement mais le temps d'édition est limité (sorry :/). Voici un programme qui tourne :

    Code:
    #include<iostream>
    #include<iomanip>
    #include<fstream>
    #include <sys/stat.h>
    #include <sys/types.h>
    using namespace std;
    
    int main(){
    
    	ofstream out1;
    	mkdir("out1", 01777); // ceci créera le dossier out1 là où l'exécution du programme aura lieu (si on fait ./nomdel'executable dans la console (de linux)), tout simplement.
    	out1.open(".//out1//out.txt"); // on met un fichier dans le dossier fraîchement créé.
    	out1 << "youpi"; // on remplit le fichier ^^
    
    	return 0;
    }
    Et le Makefile :

    Code:
    out: main.o
    	g++ -Wall main.o -o out
    
    main.o: main.cpp
    	g++ -c -Wall main.cpp
    
    ## ! pour lancer le nettoyage, demander explicitement make clean.
    .PHONY: clean
    clean:
    	-rm out *.o
    ## nb : cette forme plus compliquée de clean évite un éventuel problème avec un fichier qui se nommerait également clean.

Discussions similaires

  1. Utilisation des partions Windows avec Linux en lecture et en écriture
    Par Laurentg001 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 06/04/2005, 11h48
  2. Linux
    Par invite6cd67d9b dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 14/03/2004, 20h46
  3. Linux
    Par invitecee63112 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 10/05/2003, 21h53
  4. Linux > Windows ou Windows > Linux et la pomme dans to
    Par invite37693cfc dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 09/05/2003, 11h35
Découvrez nos comparatifs produits sur l'informatique et les technologies.