2010-09-19 4 views
5

C++ Je le code suivant:Modification du répertoire courant dans Linux en utilisant

#include <iostream> 
#include <string> 
#include <unistd.h> 

using namespace std; 

int main() 
{ 
    // Variables 
    string sDirectory; 

    // Ask the user for a directory to move into 
    cout << "Please enter a directory..." << endl; 
    cin >> sDirectory; 
    cin.get(); 

    // Navigate to the directory specified by the user 
    int chdir(sDirectory); 

    return 0; 
} 

Le but de ce code est assez explicite: pour définir un utilisateur répertoire spécifié comme répertoire courant. Mon plan est d'effectuer des opérations sur les fichiers qui y sont contenus. Cependant, lorsque je tente de compiler ce code, je reçois l'erreur suivante

error: cannot convert ‘std::string’ to ‘int’ in initialization 

référence étant faite à la ligne de lecture int chdir(sDirectory). Je viens juste de commencer à programmer et je commence à peine à découvrir les fonctions spécifiques à la plate-forme, celle-ci, et toute aide à ce sujet serait très appréciée.

Répondre

8

int chdir(sDirectory); n'est pas la syntaxe correcte pour appeler la fonction chdir. C'est une déclaration d'un int appelé chdir avec un initialiseur de chaîne non valide (`sDirectory).

Pour appeler la fonction que vous avez juste à faire:

chdir(sDirectory.c_str()); 

Notez que chdir prend un const char*, pas un std::string donc vous devez utiliser .c_str().

Si vous voulez préserver la valeur de retour, vous pouvez déclarer un entier et utiliser un chdir appel pour l'initialiser, mais vous devez donner le int un nom:

int chdir_return_value = chdir(sDirectory.c_str()); 

Enfin, notez que dans la plupart des systèmes d'exploitation le répertoire courant ou de travail ne peut être défini que pour le processus lui-même et les enfants qu'il crée. Cela n'affecte (presque) jamais le processus qui a engendré le processus en changeant son répertoire actuel.

Si vous pensez que le répertoire de travail de votre shell doit être modifié à la fin de votre programme, vous risquez d'être déçu.

+0

Merci beaucoup. J'avais mal compris plusieurs choses lors de l'écriture de ce code, mais vous avez effacé ensuite. –

5
if (chdir(sDirectory.c_str()) == -1) { 
    // handle the wonderful error by checking errno. 
    // you might want to #include <cerrno> to access the errno global variable. 
} 
2

Le problème est que vous êtes une chaîne pour passer une chaîne STL à chdir(). chdir() nécessite une chaîne de style C, qui est juste un tableau de caractères terminé par un octet NUL.

Ce que vous devez faire est chdir(sDirectory.c_str()) qui le convertira en une chaîne de style C. Et aussi l'int sur int chdir(sDirectory); n'est pas nécessaire.

+0

"n'est pas nécessaire" => en fait, c'est carrément faux. –

+1

Cela peut être un problème, mais ce n'est pas le problème que le compilateur se plaint. Le compilateur se plaint du fait que 'sDirectory' ne peut pas être utilisé pour initialiser un' int' appelé 'chdir'. –

Questions connexes