split — Разделение абсолютного пути к файлу

Я пишу программу на C ++ для школьного задания. В какой-то момент этот вопрос требует от меня смены каталогов, что я знаю, как это сделать. Тем не менее, пользователь предоставит программе абсолютный путь к файлу. То, что я пытаюсь сделать, это изменить каталог, где находится этот файл. Например, если я нахожусь в каталоге dir2, а пользователь хочет перейти к файлу

     /home/dir1/dir2/dir3/dir4/file

Я хотел бы сделать

     int ret = chdir("home/dir1/dir2/dir3/dir4");

У меня вопрос, как я могу разбить пользовательскую строку на

     /home/dir1/dir2/dir3/dir4/

а также

     file

РЕДАКТИРОВАТЬЯ понял. Сначала я преобразовал абсолютный путь из const char * в строку. Затем я использовал строковый член .find_last_of («/»), чтобы найти позицию последнего «/» в строке. Затем я использовал член .substr (), чтобы получить подстроку от 0 до той позиции, которую возвращает .find_last_of

1

Решение

Просто получите последний индекс символа «/» в пути к файлу и отрежьте файл с его расширением из строки.

1) Убедитесь, что в списке каталогов есть «/». Если нет — выкинь ошибку.

2) Получить последний индекс «/» в строке.

3) Возвратите подстроку строки каталога, используя в качестве начального индекса последний индекс результата функции (число) и общую длину строки каталога.

Надеюсь, это поможет.

2

Другие решения

ты можешь использовать

std::string dir_str = "path/file";
auto pos = dir_str.rfind("/");
if (pos!= std::string::npos) {
chdir("newpath"+dir_str.substr(pos));
//...
} else {
//do something;
}

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

если вы относитесь к файлам достаточно серьезно (например, рекурсивно просматривая каталог), я бы рекомендовал использовать что-то вроде boost :: file_system

2

Ты можешь использовать strtok функция от <string.h> разбить компоненты пути и, кстати, отслеживать каждый каталог в иерархии.

#include <stdio.h>
#include <string.h>

int main ()
{
char str[] ="/path/to/file";
char * pch;
char * temp;
pch = strtok (str,"/");
while ( (temp = strtok (NULL, "/") ) != NULL)
{
pch = temp;
}

printf("The file is: %s", pch);
return 0;
}
1

Поместите свой путь в std::string и тогда вы можете сделать что-то вроде ниже.

std::string path = "/home/person/dir/file";
std::size_t botDirPos = path.find_last_of("/");
// get directory
std::string dir = path.substr(0, botDirPos);
// get file
std::string file = path.substr(botDirPos, path.length());
// change directory.
chdir(dir.c_str());
1
По вопросам рекламы [email protected]