Est-il C++ équivalent à getcwd?
Je vois C est getcwd via:
homme 3 mdc
Je soupçonne que C++ a un similaire, qui pourrait me rendre un std::string .
Si oui, quel est son nom, et où puis-je trouver de la documentation?
Merci!
- Pourquoi ne pas simplement utiliser
std::string cwd = getcwd();
et de laisser le constructeur n'-il son travail? - ne sera pas qu'une fuite de mémoire?
- Ne getcwd() fuite de mémoire si vous n'avez pas le libérer? Si oui, alors vous devez le libérer après la création de la chaîne, par opposition à la libération il lorsque vous n'en avez plus besoin, et c'est plus pratique. Si non, alors l'initialisation de la chaîne ne sera pas une fuite de mémoire.
- Je peux confirmer avec valgrind - chaîne cwd = getcwd(NULL, 0); des fuites de mémoire!
- getcwd() alloue la mémoire tampon de façon dynamique à l'aide de malloc(3) si buf est NULL
Vous devez vous connecter pour publier un commentaire.
Ok, je vais répondre même si vous avez déjà accepté une réponse.
Encore mieux que d'envelopper le getcwd appel serait d'utiliser boost::filesystem, d'où vous aurez une
path
objet de lacurrent_path()
fonction. Le coup de pouce du système de fichiers de la bibliothèque vous permet de faire beaucoup d'autres choses utiles que vous auriez besoin de faire beaucoup de traitement de chaîne à faire, c'est de vérifier si les fichiers/répertoires existent, obtenir parent chemin, rendre les chemins d'accès complets et cætera. Check it out, il est portable en tant que bien que beaucoup de la chaîne d'analyse de code on pourrait utiliser autrement ne sera probablement pas.Mise à jour (2016): système de fichiers a été publié comme un spécification technique en 2015, basé sur un coup de pouce du système de fichiers v3. Cela signifie qu'il peut être disponible avec votre compilateur déjà (par exemple, Visual Studio 2015). Pour moi, il semble également probable qu'il va devenir le cadre d'une future norme C++ (je suppose que C++17, mais je ne suis pas au courant de l'état actuel).
Mise à jour (2017): La système de fichiers de la bibliothèque a été fusionné avec l'ISO C++ en C++17, pour
std::string
s'constructeur peut prendre en toute sécurité unechar*
en tant que paramètre. Etonnamment, il y a un la version windows trop.Edit: en fait c'est un peu plus compliqué:
Mémoire n'est pas un problème -- temp est une pile en fonction de la mémoire tampon, et l'std::string constructeur fait une copie. Probablement que vous pourriez faire d'un seul coup, mais je ne pense pas que la norme serait de garantir que.
Sur l'allocation de la mémoire, par POSIX:
getcwd
comme un non-argument de la fonction, encore de la documentation, je vois apparaître deux paramètres. Suis-je en lisant le mal de docs?malloc
ed et devrait êtrefree
d après la création d'un std::string à partir d'elle.Essayons et de réécrire cette simple C d'appel en tant que C++:
La chose est, quand la recouvrant d'une bibliothèque de fonction dans une autre fonction, vous devez supposer que toutes les fonctionnalités doivent être exposés, en raison d'une bibliothèque ne sais pas ce qui va être en l'appelant. Donc, vous avez à gérer les cas d'erreur plutôt que de simplement en avalant ou en espérant qu'ils ne se produira pas.
Il est généralement préférable de laisser le code du client il suffit d'appeler la fonction de la bibliothèque, et de traiter l'erreur à ce point - le code client n'a probablement pas de soins pourquoi l'erreur s'est produite, et donc n'a qu'à gérer le pass/fail cas, plutôt que de tous les codes d'erreur.
!= 0
au lieu de== 0
sur la cinquième ligne.Vous devez juste écrire un petit wrapper.
std::string getcwd_string( void ) { string ret(PATH_MAX,0); getcwd( &ret[0], PATH_MAX ); ret.resize(ret.find_first_of('\0',0)); return ret; }
- en évitant VLA (qui n'est pas techniquement partie de c++ normes, du moins pas encore, mais la plupart des compilateurs de soutien comme une extension de la langue)Toutes les fonctions C sont également les fonctions C++. Si vous avez besoin d'un
std::string
, créez-en un à partir de lachar*
que getcwd obtient pour vous.J'ai utilisé
getcwd()
en C de la manière suivante:Le fichier d'en-tête nécessaires est
stdio.h
.Lorsque j'utilise le compilateur C, il fonctionne parfaitement.
Si je compile exactement le même code à l'aide du compilateur C++, il signale le message d'erreur suivant:
Puis j'ai compris
unistd.h
et compilé avec le compilateur C++.Cette fois, tout fonctionne.
Quand j'ai basculé vers le compilateur C, il fonctionne encore!
Aussi longtemps que vous incluez les deux
stdio.h
etunistd.h
, le code ci-dessus fonctionne pour les compilateurs C ET C++.J'ai aussi utilisé boost::filesystem comme dit dans une autre réponse ci-dessus. Je voulais juste ajouter que, depuis l' current_path() fonction ne renvoie pas une std::string, vous devez le convertir en.
Voici ce que j'ai fait:
Vous pouvez créer une nouvelle fonction, que je préfère sur la liaison à une bibliothèque comme boost(à moins que vous ne l'êtes déjà).