#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
разбивать их на завершающиесимволы, а не на новую строку.