2010-09-19 19 views
5

Mam następujący kod:Zmiana bieżącego katalogu w systemie Linux przy użyciu 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; 
} 

Celem niniejszego Kodeksu jest dość oczywista: ustawianie katalogu użytkownika określonego w bieżącym katalogu. Moim planem jest przeprowadzenie operacji na plikach w nim zawartych. Jednak, gdy próbuję skompilować ten kod, otrzymuję następujący błąd

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

z odniesieniem do linii odczytu int chdir(sDirectory). Właśnie zacząłem programować i dopiero teraz zacząłem się dowiadywać o funkcje specyficzne dla platformy, które to są, więc wszelka pomoc w tej sprawie byłaby najbardziej doceniana.

Odpowiedz

8

int chdir(sDirectory); nie jest poprawną składnią do wywołania funkcji chdir. Jest to deklaracja int o nazwie chdir z niepoprawnym inicjatorem ciągu (`sDirectory).

Aby wywołać funkcję po prostu trzeba zrobić:

chdir(sDirectory.c_str()); 

Zauważ, że chdir pobiera const char*, a nie std::string więc trzeba użyć .c_str().

Jeśli chcesz zachować wartości zwracanej można zadeklarować liczbę całkowitą i używania chdir wywołanie go zainicjować, ale trzeba dać int nazwę:

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

Wreszcie, należy pamiętać, że w większości systemów operacyjnych bieżący lub katalog roboczy można ustawić tylko dla samego procesu i dowolnych dzieci, które on tworzy. To (prawie) nigdy nie wpływa na proces, który spowodował proces zmiany jego bieżącego katalogu.

Jeśli spodziewasz się, że katalog roboczy twojej powłoki zostanie zmieniony po zakończeniu programu, prawdopodobnie się zawiedziesz.

+0

Wielkie dzięki. Podczas pisania tego kodu źle zrozumiałem kilka rzeczy, ale oczyściłeś to. –

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

Problem polega na tym, że jesteś ciągiem, który przekazuje ciąg STL do chdir(). chdir() wymaga łańcucha w stylu C, który jest po prostu tablicą znaków zakończonych bajtem NUL.

To, co musisz zrobić, to chdir(sDirectory.c_str()), które przekonwertuje go na ciąg w stylu C. A także int na int chdir(sDirectory); nie jest konieczne.

+0

"nie jest konieczne" => w rzeczywistości jest to nieprawidłowe. –

+1

Może to być _an_ problem, ale to nie jest problem, na który kompiluje się skarga. Kompilator narzeka na fakt, że 'sDirectory' nie może być użyty do zainicjowania' int' zwanego 'chdir'. –

Powiązane problemy