Использование char * для хранения правильного пути к файлу - PullRequest
0 голосов
/ 08 августа 2011

Прошло много времени с тех пор, как я запутался в C / C ++, и моя память о доступных функциях для работы с символом * исчезла из окна.

В настоящее время я использую следующий код для получения текущего рабочего каталога ...

char *path = NULL;
size_t size = 0;

path = _getcwd(path, size);
Msg("Current Working Directory: %s\n", path);

Однако мне нужно выбрать этот путь, затем отрезать последний каталог и перенести его в предыдущий каталог. В настоящее время он хранит что-то вроде «C: / srcds / orangebox» в пути, и мне нужно удалить последний каталог из этого, чтобы получить правильный путь. В этом случае это будет "C: / srcds".

Каков наилучший способ сделать это с помощью символа *? Пожалуйста, не предлагайте использовать строки. Я знаю, что это намного проще, но SDK, который я использую, вращается вокруг char *, поэтому я стараюсь придерживаться этого для удобства чтения.

Ответы [ 5 ]

2 голосов
/ 08 августа 2011

Хорошо - чтобы ваша жизнь была сложной ..

  1. используйте strrchr, чтобы найти последние \
  2. используйте memcpy (если у вас нет strncpy)скопировать количество символов в эту точку.

Я должен добавить, что 1. вернет последний \, поэтому вы, если ваш путь подобен C:/foo/bar/, этоостановится на / - так что вам придется сделать некоторые пограничные проверки ... Я сказал "чтобы ваша жизнь была сложной" ...

1 голос
/ 08 августа 2011

Было бы намного проще просто преобразовать его в строку, выполнить find_last_of и затем преобразовать его обратно в символ *, вызвав c_str. Но так как это не вариант:

Редактировать : Оооо, я не знал о strrchar , это определенно было бы идеально. Вам нужно будет просто перебрать строку символов, начиная с последнего индекса и работать в обратном направлении , использовать strrchar , чтобы найти символ пути (кажется, что "/" в ваш случай, но вы должны убедиться, что так будет всегда), а затем скопировать строку (strcpy или одну из связанных функций) в нужную вам часть пути до индекса, где было найдено начало последней папки.

Обязательно проверьте наличие особых случаев, таких как

1) Возвращенный путь имеет только один каталог.

2) Путь не был возвращен.

3) Любые другие случаи, которые может вернуть _getcwd - проверьте документацию этого метода.

0 голосов
/ 08 августа 2011

Как то так?

    char *FullPath = "C:/srcds/orangebox";

    char Buffer[100];

    strcpy(Buffer, FullPath);

    char* Temp = strchr(Buffer, '/');  // find first slash

    if (Temp == NULL)
        ; // handle error

    Temp++;  // skip past slash
    if (Temp == NULL)
        ; // handle error

    Temp = strchr(Temp, '/');  // find second slash

    if (Temp == NULL)
        ; // handle error

    *Temp = 0;  // add string terminator

    puts(Buffer);
0 голосов
/ 08 августа 2011

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

Для общего использования путей в общем случае рассмотрите возможность использования библиотеки Boost Filesystem .

РЕДАКТИРОВАТЬ: Я обнаружил следующее:

Как расширение стандарта POSIX.1-2001, Linux (libc4, libc5, glibc) getcwd () распределяет буфер динамически, используя malloc (), если buf равен NULL при вызове.В этом случае выделенный буфер имеет размер длины, если размер не равен нулю, когда buf выделяется настолько большим, насколько это необходимо.Можно (и даже желательно) освободить () буферы, если они были получены таким образом.

Обратите внимание, что в Windows поведение противоположное, а именно гарантированный сбой.

ура & hth.,

0 голосов
/ 08 августа 2011

Подсказка:

int len= strlen(path);
len--;
while(path[len]!='\\')
{
  len--;
}
path[len]='\0';
...