2009-05-03 4 views
2

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

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

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

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

ответ

0

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

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

Выключает. получает «каталог рабочего пути».

0

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

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

0

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

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

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

GetModuleFileName(NULL, buffer, length); 
+0

Я запускаю windows xp, я хотел бы иметь возможность получить папку моего исполняемого файла, чтобы я мог поддерживать подкаталог относительно моего исполняемого файла. –

+0

Итак, есть ли лучший способ сделать то, что я пытаюсь сделать? Я использую Visual C++ Express, но я не думаю, что это было актуально. –

1

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

+2

Хотя этот ответ верный, он немного короток. Вероятно, интересующемуся интересует атрибут «initial_path» для boost :: filesystem. http://www.boost.org/doc/libs/1_39_0/libs/filesystem/doc/reference.html#Attribute-функции, которые сообщают вам, с какого пути было запущено приложение. Используя полную (которая использует initial_path), вы можете построить любой интересующий вас субдир: boost :: filesystem :: complete ("/ content/images/background.bmp"); – lefticus

0

Вы судимое делать:

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

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

0

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

#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 (TWO r в середине) находит последнее вхождение данного символа и возвращает указатель на него. Предполагая, что вы используете однобайтные символы, вычитание 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.

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

Надежда, что помогает и не слишком запутанным ...