Изменение текущего каталога в Linux с помощью C ++ - PullRequest
6 голосов
/ 19 сентября 2010

У меня есть следующий код:

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

Цель этого кода довольно понятна: установить указанный пользователем каталог в качестве текущего. Мой план состоит в том, чтобы выполнить операции с файлами, содержащимися в нем. Однако, когда я пытаюсь скомпилировать этот код, я получаю следующую ошибку

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

со ссылкой на строку int chdir(sDirectory). Я только начал программировать и только сейчас начинаю узнавать о специфических для платформы функциях, которыми мы являемся, поэтому любая помощь в этом вопросе будет наиболее ценной.

Ответы [ 3 ]

8 голосов
/ 19 сентября 2010

int chdir(sDirectory); неверный синтаксис для вызова функции chdir.Это объявление int, называемое chdir с недопустимым инициализатором строки (`sDirectory).

Чтобы вызвать функцию, вам просто нужно сделать:

chdir(sDirectory.c_str());

Обратите внимание, чтоchdir принимает const char*, а не std::string, поэтому вы должны использовать .c_str().

Если вы хотите сохранить возвращаемое значение, вы можете объявить целое число и использовать вызов chdir для его инициализациино вы должны дать int имя:

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

Наконец, обратите внимание, что в большинстве операционных систем текущий или рабочий каталог может быть установлен только для самого процесса и всех дочерних процессов, которые он создает.Это (почти) никогда не влияет на процесс, который порождал процесс, изменяя его текущий каталог.

Если вы ожидаете, что рабочий каталог вашей оболочки будет изменен после завершения вашей программы, вы, вероятно, будете разочарованы.

5 голосов
/ 19 сентября 2010
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 голосов
/ 19 сентября 2010

Проблема в том, что вы строка для передачи строки STL в chdir (). Для chdir () требуется строка в стиле C, представляющая собой массив символов, оканчивающихся байтом NUL.

Что вам нужно сделать, это chdir(sDirectory.c_str()), который преобразует его в строку стиля C. А также int на int chdir(sDirectory); не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...