Qu'est-ce qu'un moyen multi-plateforme pour obtenir le répertoire actuel?
J'ai besoin d'une croix-plate-forme de façon à obtenir le répertoire de travail courant (oui, getcwd fait ce que je veux). J'ai pensé que cela pourrait faire l'affaire:
#ifdef _WIN32
#include <direct.h>
#define getcwd _getcwd //stupid MSFT "deprecation" warning
#elif
#include <unistd.h>
#endif
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s_cwd(getcwd(NULL,0));
cout << "CWD is: " << s_cwd << endl;
}
J'ai eu cette lecture:
Il devrait y avoir pas de fuites de mémoire, et il devrait fonctionner sur un Mac, correct?
Mise à JOUR: j'ai peur de quelque chose est encore mal ici (j'essaie d'éviter la création d'un char tableau avec une longueur, comme il n'y a pas de bonne façon d'obtenir une bonne longueur pour getcwd):
char* a_cwd = getcwd(NULL,0);
string s_cwd(a_cwd);
free(a_cwd); //or delete a_cwd?
source d'informationauteur rubenvb
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas appeler
getcwd
avec une valeur NULL tampon. Comme par le Opengroup:Aussi, getcwd peut retourner la valeur NULL qui peut briser une chaîne de constructeur.
Vous aurez besoin de le changer pour quelque chose comme:
Si c'est pas un problème pour vous de comprendre, d'utiliser boost système de fichiers pour la pratique de la croix-plate-forme d'opérations de système de fichiers.
Voici un exemple.
EDIT: comme l'a souligné le Roi Danton dans les commentaires, le système de fichier est devenu une partie de la ISO C++ en C++17afin de booster n'est plus nécessaire:
Appel getcwd avec un pointeur NULL est définie par l'implémentation. Il fait souvent l'allocation pour vous avec malloc (dans ce cas, votre code ne avoir une fuite de mémoire). Cependant, il n'est pas garanti pour fonctionner. Donc, vous devez allouer votre propre tampon.
L'Open Group a un exemple montrant comment tirer le maximum de longueur de chemin de _PC_PATH_MAX. Vous pourriez envisager d'utiliser MAX_PATH sur Windows. Voir cette question pour les mises en garde à ce numéro sur les deux plates-formes.