Подкаталог изображений в C ++ - PullRequest
2 голосов
/ 03 мая 2009

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

// DEFINES
#define IMAGE_BACKGROUND "\\content\\images\\background.bmp"
#define FONT_MAIN "\\content\\fonts\\sai.ttf"

Приведенный выше код явно не работает. Я читал якобы args [0] это как-то мой путь? Кто-нибудь хочет разработать немного больше?

int main(int argc, char* args[])
{

Ответы [ 6 ]

1 голос
/ 03 мая 2009

Я должен отметить, что Boost.Filesystem - хорошая библиотека, которая может вам помочь.

0 голосов
/ 06 мая 2009

Я действительно решил это с помощью следующего кода, спасибо всем за ответы:

// DEFINES
#define IMAGE_BACKGROUND ".\\content\\images\\background.png"
#define IMAGE_BLUEBLOCK ".\\content\\images\\blueblock.png"
#define FONT_MAIN ".\\content\\fonts\\sai.ttf"

Получается. получает «каталог рабочего пути».

0 голосов
/ 04 мая 2009

Этот код должен работать:

#define IMAGE_BACKGROUND "\\content\\images\\background.bmp"

int main(int argc, char* args[])
{

    char buf[512];
    int endOfPath = strrchr(args[0], '\\') - args[0];
    strncpy_s(buf, sizeof(buf), args[0], endOfPath);
    strcat(buf, IMAGE_BACKGROUND);

Как сказал другой человек, args [0] - это полный путь исполняемого файла, поэтому вы не можете использовать его как есть. Функция strrchr (два в середине) находит последнее вхождение данного символа и возвращает указатель на него. Предполагая, что вы используете однобайтовые символы, вычитая args [0] из возвращенного указателя, вы получите количество символов между двумя указателями. Когда вы вычитаете два указателя, вы фактически вычитаете адреса памяти, так что вы слева - смещение или расстояние между указателями. Это расстояние похоже на индекс найденного символа.

Затем я использую функцию strncpy_s, чтобы скопировать число символов endOfPath из args [0] во временный буфер. Теперь, если путь вашей программы был
"C: \ Windows \ Users \ Me \ Desktop \ myProgram \ theProgram.exe"
переменная buf будет содержать
"C: \ Windows \ Users \ Me \ Desktop \ myProgram"

Затем я использовал функцию strcat (conCATenation), чтобы добавить вашу константу в конец.

Обратите внимание, что с вашим #define ТРЕБУЕТСЯ "\\" в C / C ++, а также обратите внимание, что "метки будут включаться везде, где вы используете IMAGE_BACKGROUND.

После этих строк кода buf будет содержать:
"C: \ Windows \ Users \ Me \ Desktop \ MyProgram \ Содержание \ Images \ background.bmp"

Надеюсь, что это помогает и не слишком смущает ...

0 голосов
/ 03 мая 2009

Вы пробовали делать:

#define IMAGE_BACKGROUND "\content\images\background.bmp"

Это может быть проблемой (так как я использовал изображения из подпапок, как это раньше)

0 голосов
/ 03 мая 2009

args[0] - это имя, используемое для вызова вашего исполняемого файла, которое не обязательно является полным путем вашего исполняемого файла. Вы заинтересованы в рабочем каталоге вашего исполняемого файла, который зависит от ОС.

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

Поскольку вы находитесь в Windows, вы можете использовать функцию GetModuleFileName (см. Документацию ), чтобы получить полное имя вашего исполняемого файла, например:

GetModuleFileName(NULL, buffer, length);
0 голосов
/ 03 мая 2009

args [0] - это полное имя пути (хорошо, но это также определяется ОС и оболочкой, поэтому вы можете получить краткое имя файла, которое не является полным) для вашего «исполняемого файла», а не для его папки. Вы должны усечь это.

попробуйте splitpath и joinpath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...