Обратитесь к файлам данных из проекта C ++ - PullRequest
1 голос
/ 30 января 2012

У меня есть проект C ++ со структурой папок, примерно такой:

root/trunk
root/trunk/src/...        
root/trunk/include/...    
root/trunk/utils/...      <-- this has the `main` programs which are compiled
root/trunk/bin/...        compiled binaries
root/data/...             data used in the programs

В моих исходных файлах я иногда ссылаюсь на файлы, включенные в подпапки данных. Я хочу, чтобы пути, которые я использую, были относительными (потому что я делюсь этим проектом с кем-то еще).

Как я могу гарантировать, что файлы данных всегда можно найти? В настоящее время я использую следующие пути:

std::string my_data("../../../data/path/to/file.txt");

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

Ответы [ 4 ]

2 голосов
/ 30 января 2012

Прежде чем идти дальше, вы хотите определить каталог доставки состав; что увидят другие пользователи при установке вашего кода. Затем, работа с этого: под Windows, вы можете использовать функцию GetModuleFileName, чтобы найти, где находится ваш бинарный файл, и работать с тот; под Unix традиционно требуется, чтобы пользователь установил переменная окружения, что-то вроде MYPROJ_ROOT, и использовать его в качестве корень вашего дерева. В любом случае, у вас есть отправная точка; ты хочешь свой имена файлов относительно этого, а не для текущего рабочего каталога. Вы можете сделать это, изменив текущий рабочий каталог на ваш процесс (SetCurrentDirectory под Windows, chdir под Unix), или (мое предпочтительное решение), используя что-то вроде boost::filesystem построить абсолютные имена из имени корня.

2 голосов
/ 30 января 2012

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

$ cd /tmp
$ /path/to/my/program/root/trunk/bin/my_program

и посмотрите, все ли в порядке.

1 голос
/ 30 января 2012

Обычный метод организации файлов данных - это создать папку «корень данных» при запуске программы, а затем кодировать ваши пути относительно этого. Корень данных может быть автоматически определен путем поиска (текущий каталог и, возможно, его родитель, дедушка и т. Д., Вплоть до реального корня.) По специально названному файлу или каталогу (например, «.foo») и переопределен переменной среды. или переключатель командной строки (например, FOO_DATA_DIR = "/ home / fred / bar").

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

0 голосов
/ 30 января 2012

В вашем вопросе недостаточно кода, чтобы точно увидеть, что вы делаете, но в прошлом я использовал макрос препроцессора __FILE__ (и впоследствии удалял имена файлов / каталогов) для ссылки на файлы,относительно того, где находятся исходные файлы:

http://www.codeguru.com/forum/showthread.php?t=380822

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