Как открыть файл с путем относительно файла c, а не рабочий каталог - PullRequest
1 голос
/ 04 апреля 2019

Я изменяю большую кодовую базу, написанную на C. Этот код предназначен для компиляции и запуска из произвольного рабочего каталога.Это делается для того, чтобы файлы конфигурации можно было читать и выводить в рабочий каталог / из него, упрощая организацию и вывод кода.

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

big_project/
|-- models/
|   |-- my_file.c
|   |-- my_data.txt

Моя проблема возникает при попытке открыть этот файл данных с использованием относительнойпути.Обычно относительные пути относятся к рабочему каталогу, что не будет работать в моем случае, так как рабочий каталог может быть произвольным.Изнутри my_file.c, как я могу открыть my_data.txt для чтения по относительным путям?

1 Ответ

1 голос
/ 05 апреля 2019

Исходя из нашего разговора в комментариях, у вас есть несколько альтернатив, которые я перечислю ниже, от ИМХО, до наименее желательных.

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

Множественные и пользовательские файлы конфигурации (рекомендуется)

Вы можете изменить свою программу для просмотраСтандартное расположение вашей платформы для данных программы и / или файлов конфигурации.Например, вы можете найти стандартный конфиг по адресу /etc/<your-program>/default.conf в GNU + Linux или %APPDATA%\<your-program>\default.conf в Windows.

Если разные пользователи должны использовать свои личные настройки, программу также можно сделатьпринять путь к файлу конфигурации в качестве аргумента.Например:

GNU + Linux:

$ ./your-program --config ${HOME}/.your-program/my.conf

Windows:

> your-program.exe --config %userprofile%\your-program\my.conf

Обратите внимание, что использование %userprofile% может меняться в зависимости от версий Windows и / илииспользуемые оболочки (например, стандартный cmd.exe против powershell).

Компиляция в пути (не рекомендуется)

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

если вы полностью уверены в программе всегда будучи помещенным в один и тот же каталог для всех , вы можете установить абсолютный путь, показанный макросом __FILE__, если отправите полный путь при компиляции;Например, gcc $(pwd)/your-file.c, при печати __FILE__ будет показан полный путь, который у него был в время компиляции , а не время выполнения.(Однако здесь нельзя добавить достаточное количество заявлений об отказе от ответственности)

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

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