2010-09-19 16 views
5

Ho il seguente codice:cambiare la directory corrente in Linux utilizzando 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; 
} 

Lo scopo di questo codice è piuttosto auto esplicativo: per impostare una directory utente specificato come directory corrente. Il mio piano è di eseguire operazioni sui file in esso contenuti. Tuttavia, quando si tenta di compilare questo codice, viene visualizzato il seguente errore

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

e fanno riferimento alla lettura della linea int chdir(sDirectory). Ho appena iniziato a programmare e sto solo ora cominciando a scoprire le funzioni specifiche della piattaforma, che è questa, quindi qualsiasi aiuto su questo argomento sarebbe più apprezzato.

risposta

8

int chdir(sDirectory); non è la sintassi corretta per chiamare la funzione chdir. È una dichiarazione didenominata chdir con un inizializzatore di stringa non valido (`sDirectory).

per chiamare la funzione basta fare:

chdir(sDirectory.c_str()); 

Nota che chdir prende una const char*, non un std::string quindi bisogna usare .c_str().

Se si vuole preservare il valore di ritorno è possibile dichiarare un intero e utilizzare una chiamata chdir per inizializzare, ma devi dare il int un nome:

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

Infine, ricordiamo che nella maggior parte dei sistemi operativi la directory corrente o di lavoro può essere impostata solo per il processo stesso e per i bambini che crea. Non ha (quasi) mai influenzato il processo che ha generato il processo cambiando la sua directory corrente.

Se si prevede di trovare la directory di lavoro della shell da modificare una volta terminato il programma, si rischia di rimanere delusi.

+0

Grazie mille. Avevo frainteso diverse cose scrivendo questo codice, ma tu hai chiarito poi. –

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

Il problema è che si è una stringa per passare una stringa STL a chdir(). chdir() richiede una stringa di stile C, che è solo una matrice di caratteri terminata con un byte NUL.

Quello che devi fare è chdir(sDirectory.c_str()) che lo convertirà in una stringa di stile C. E anche l'int su int chdir(sDirectory); non è necessario.

+0

"non è necessario" => in realtà, è semplicemente sbagliato. –

+1

Potrebbe trattarsi di un problema _an_, ma non è questo il problema di cui il compilatore si lamenta. Il compilatore si lamenta del fatto che 'sDirectory' non può essere usato per inizializzare un' int' chiamato 'chdir'. –

Problemi correlati