2016-02-20 5 views
0

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

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

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

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

Мой вопрос, как я могу разделить USER- данная строка в

 /home/dir1/dir2/dir3/dir4/ 

и

 file 

EDIT Я понял. Сначала я преобразовал абсолютный путь из const char * в строку. Затем я использовал член строки .find_last_of ("/"), чтобы найти позицию последнего «/» в строке. Затем я использовал член .substr(), чтобы получить подстроку от 0 до этой позиции, возвращаемой .find_last_of

+0

Поместите свою резиновую утку - https://en.wikipedia.org/wiki/Rubber_duck_debugging - рядом с вашей клавиатурой и объясните свою резиновую утку на простом английском языке, ваш логический шаг за шагом, алгоритм, который делает это. Как только ваша резиновая утка соглашается с тем, что ваш алгоритм будет работать, просто возьмите свое объяснение и переведите его в код. –

+1

Я не совсем уверен, какие параметры мне нужно разделить на строки таким образом. Я знаю, что я могу разбить его на основе пробелов, используя stringstreams. Но это другой разделитель.Я хотел бы разбить его в соответствии с последним '/' –

+0

В классе std :: string есть методы для разбиения и измельчения строки любым способом, который вам нравится. Если вы хотите извлечь части строки до или после позиции #n, std :: string предлагает несколько методов для этого. –

ответ

2

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

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

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

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

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

1

Функцию strtok можно использовать для разделения компонентов пути и путем отслеживания каждого каталога в иерархии.

#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()); 
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.

Смежные вопросы