Получить результат запроса командной строки и открыть файл - PullRequest
0 голосов
/ 29 марта 2019

Я использую следующую функцию:

std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
    if (!pipe) {
        throw std::runtime_error("popen() failed!");
    }
    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
        result += buffer.data();
    }
    return result;
}

std::string filepath = exec("locate filename.txt");

Возвращает std::string, и я конвертирую его, используя .c_str() в:

std::ifstream file(filepath.c_str(), ios::in);

Но после того, как я попробую:

if(file)
{
    ...
}
else
{
    std::cerr << "File missing : " + filepath << std::endl;
}

И я получаю:

File missing : /path/to/file

1 Ответ

2 голосов
/ 29 марта 2019

Команда Unix locate выводит символ новой строки ('\n') после каждого имени файла, поэтому вам необходимо удалить этот символ из вывода команды locate, прежде чем использовать его в качестве имени файла. Возможно, вы могли бы использовать метод pop_back класса string для этого.

Также обратите внимание, что locate может выводить несколько имен файлов, а имена файлов могут содержать символы новой строки внутри.

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