Получить результат запроса командной строки и открыть файл

#c #string #file #command-line #char

#c #строка #файл #командная строка #символ

Вопрос:

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

 std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string resu<
    std::unique_ptr<FILE, decltype(amp;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 resu<
}

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

Он возвращает a, 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. Попробуйте написать сообщение об ошибке, подобное std::cerr << "File missing : -" filepath << "-" << std::endl; Тогда можно было бы довольно легко увидеть, есть ли в строке начальный или конечный пробел, которого там быть не должно.

Ответ №1:

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

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

Комментарии:

1. Решение для имен файлов, содержащих символы новой строки, заключается в том, чтобы locate -0 filename.txt разбивать их на завершающие символы, а не на новую строку.