2010-09-19 10 views
5

Tengo el siguiente código:cambiar el directorio actual en Linux usando C++

#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; 
} 

El propósito de este código es bastante explicativo: para establecer un directorio especificado por el usuario como el directorio actual. Mi plan es llevar a cabo operaciones en los archivos que contiene. Sin embargo, cuando intento compilar este código, recibo el siguiente error

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

haciéndose referencia a la línea de lectura int chdir(sDirectory). Acabo de comenzar a programar y ahora solo estoy empezando a tener que averiguar sobre las funciones específicas de la plataforma, que es esta, por lo que cualquier ayuda en este asunto sería muy apreciada.

Respuesta

8

int chdir(sDirectory); no es la sintaxis correcta para llamar a la función chdir. Es una declaración de int llamada chdir con un inicializador de cadena no válido (`sDirectory).

llamar a la función sólo hay que hacer:

chdir(sDirectory.c_str()); 

Tenga en cuenta que chdir toma un const char*, no un std::string lo que tiene que utilizar .c_str().

Si desea conservar el valor de retorno se puede declarar un entero y utilizar una llamada chdir inicializarlo, pero hay que dar a la int un nombre:

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

Por último, cabe destacar que en la mayor parte del sistema operativo el directorio actual o de trabajo solo se puede configurar para el proceso en sí y para cualquier elemento secundario que cree. Casi nunca afecta el proceso que generó el proceso cambiando su directorio actual.

Si espera encontrar un cambio en el directorio de trabajo de su shell una vez que finaliza su programa, es probable que se sienta decepcionado.

+0

Muchas gracias. Había malinterpretado varias cosas cuando escribía este código, pero luego lo borraste. –

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

El problema es que está cadena para pasar una cadena STL a chdir(). chdir() requiere una cadena de Estilo C, que es solo una matriz de caracteres terminados con un byte NUL.

Lo que necesita hacer es chdir(sDirectory.c_str()) que lo convertirá en una cadena C Style. Y también el int en int chdir(sDirectory); no es necesario.

+0

"no es necesario" => en realidad, es completamente erróneo. –

+1

Eso puede ser un problema, pero ese no es el problema por el que el compilador se queja. El compilador se queja del hecho de que 'sDirectory' no se puede usar para inicializar un' int' llamado 'chdir'. –

Cuestiones relacionadas