LINUX.ORG.RU

Относительные пути (хелп ме бротхер).


0

1

Вообщем есть такой код:

#include <iostream>
#include <tinyxml.h>
#include <tinystr.h>

using namespace std;

int main()
{
    //Открываем XML-файл:

TiXmlDocument *xml_file = new TiXmlDocument("1.xml");


if(!xml_file->LoadFile()){
cout << "Error: unable to load configuration file." << endl;
return false;}

    TiXmlElement *xml_level = 0;
    xml_level = xml_file->FirstChildElement("level");

    string nm = xml_level->Attribute("name");

    cout << nm << endl;
    return 0;
}

Нужно указать путь так что бы файл 1.xml искался в том месте где и бинарник запускаемой проги, «home/nameuser итп» не катит, потому как неизвестно куда юзер положит бинарник с файлом 1.xml, может на рабочий стол вообще и от туда будет пускать. Как путь указать относительный бинарника?



Последнее исправление: LoveGnome (всего исправлений: 1)

>Как путь указать относительный бинарника?
Дак тебе какраз не относительный, а абсолютный путь нужен, получается.

Bad_ptr ★★★★★
()
Ответ на: комментарий от LoveGnome

В argv[0] хранится путь к бинарнику. Оттуда легко выделить имя каталога и бинарником, а значит, и с 1.xml.

Нужно указать путь так что бы файл 1.xml искался в том месте где и бинарник запускаемой проги

Программы для шиндошс пишем?

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

>Программы для шиндошс пишем?

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

LoveGnome
() автор топика
Ответ на: комментарий от xapienz

>запусти это и попытайся...

Ага, дошло, спасибо.

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

>для оси четких поЦИков, гейская ось
ну тут понятно, виндавс, макос

и ось гламурных блондинок

а это не понятно

anonymous
()
Ответ на: комментарий от anonymous

>ну тут понятно, виндавс, макос

а это не понятно

Вы все перепутали.

Гейская ось - ос билли гейДса, в простонародье виндовс

Ось четких пацанЧегов - линукс

Ось гламурных блондинок - мак ос

LoveGnome
() автор топика
#include <libgen.h>
#include <limits.h>
#include <string.h>

/* warning: прочитай про PATH_MAX vs pathconf() */
char filepath[PATH_MAX];
filepath = snprintf("%s/%s", PATH_MAX, dirname(strdup(argv[0])), "1.xml");

TiXmlDocument *xml_file = new TiXmlDocument(filepath);
val-amart ★★★★★
()
Ответ на: комментарий от LoveGnome

>Вы все перепутали.

А по-моему, вы всё перепутали.

Ось четких пацанЧегов - линукс

Нет, школоло-ос — это бубунта, а не Линукс.

Если это действительно будет программа для Линукса, то она такая не нужна, что в /usr/bin вперемешку с бинарями будут какие-то конфиги в xml'е.

gentoo_root ★★★★★
()
Ответ на: комментарий от val-amart

на винде и макоси кстати это не будет корректно работать, адаптируй по примеру.

val-amart ★★★★★
()
Ответ на: комментарий от gentoo_root

>Если это действительно будет программа для Линукса, то она такая не нужна, что в /usr/bin вперемешку с бинарями будут какие-то конфиги в xml'е.

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

LoveGnome
() автор топика
Ответ на: комментарий от geekless

справедливо. вот вариант линукс-с-проком-онли. лень крутить обвязку из проверок, но ТС, ты обязательно это все должен будешь сделать если тебе нужна кроссплатформенность!

#include <libgen.h>
#include <limits.h>
#include <string.h>

/* warning: прочитай про PATH_MAX vs pathconf() */
char filepath[PATH_MAX], procpath[PATH_MAX];

/* warning: /proc есть не везде и не всегда, и к тому же на других юниксах путь к бинурнику будет в другом файле */
readlink("/proc/self/exe", procpath, PATH_MAX);
filepath = snprintf("%s/%s", PATH_MAX, dirname(strdup(procpath)), "1.xml");

TiXmlDocument *xml_file = new TiXmlDocument(filepath);

val-amart ★★★★★
()
Ответ на: комментарий от LoveGnome

Кроме того устанавливаться в user/bin ничего не будет, юзер тупо вытаскивает с архива папку проги в ЛЮБОЕ место и запускает.

LoveGnome
() автор топика
Ответ на: комментарий от val-amart

>вот вариант линукс-с-проком-онли. лень крутить обвязку из проверок...

Спасибо, посмотрю, почитаю

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

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

Программы хранят настройки _пользователя_ в домашнем каталоге _пользователя_, а _общесистемные_ настройки в общем каталоге /etc. Иначе быть не может. Если настройки специфичны для пользователя, положи их в ~/.program-name.xml. Если они действуют для всей системы, то в /etc/program-name.xml. Эти файлы могут дополнять или заменять друг друга (у пользовательского приоритет выше, как, например, для vimrc).

Настройки хранятся в /etc, бинарники в /usr/bin, и иначе быть не может. В таком виде, как сейчас, твоя программа не нужна Линуксу.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

>Программы хранят настройки _пользователя

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

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

>юзер тупо вытаскивает с архива папку проги в ЛЮБОЕ место и запускает.

Юзер устанавливает пакет, скрипты всё делают сами и кладут, куда надо, нужные файлы.

Я делаю прогу так как считаю нужным, и излишний … с ее установкой для юзера мне не нужен, вытащить из архива в любое место это есть ТРУ метод, тем кто ей будет пользоваться … не нужны ваши принципы линукса.

1. Ей никто не будет пользоваться.

2. Надо соблюдать стандарты, их не просто так пишут. Иначе будет не система, а один большой каталог, в котором свалены все файлы в кучку, как в первых версиях MS-DOS (в принципе, венда даже сейчас отличается только тем, что свалка файлов не в /, а в /WINDOWS).

3. Юзеру проще скачать пакет, кликнуть на него и запускать программу, откуда захочет (из меню, с панели, с десктопа), а не трахаться с архивами, занимать своё место в ~ программами, создавать ручками кнопки запуска (чего большинство хомяков не умеют) и т.п.

4. В чём смысл каждому пользователю отдельно устанавливать одну и ту же программу, занимать место одним и тем же много раз?

5. Как она в таком случае будет обновляться? Свой велосипед, как в программах для шиндошс?

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

gentoo_root ★★★★★
()
Ответ на: комментарий от LoveGnome

>То что ты написал во первых специфично для линукса

Не-а, открой для себя настройки программ в «Documents and Settings/%username%» в венде. Многие программы хранят настройки там, остальные в реестре.

это создаст лишний геморрой для пользователя

Нет, читай пост ниже, геморроя с твоим методом больше и для юзера, и для тебя.

ради каких то линуксовых принципов?

find / -exec mv '{}' / \;

Поверь, так тебе будет лучше и удобнее.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

В целом убидил но:

1. Ей никто не будет пользоваться.

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

LoveGnome
() автор топика
Ответ на: комментарий от anonymous

> А нафейхоа strdup() ??!!!!!111oneoneeleven

dirname() принимает char* а не const char* не с проста - она может модифицировать строку. на вякий случай короче)

val-amart ★★★★★
()
Ответ на: комментарий от gentoo_root

>Если они действуют для всей системы, то в /etc/program-name.xml

Как понять для всей СИСТЕМЫ? В моем конфиге будут настройки только для моей же проги, они не специфичны для юзера, то есть не зависят от его выбора как например храниени насройки разрешения экрана, они нужны только самой программе, так куда мне сувать конфиг - в каталог юзера или в etc? Кстати если в кат-юзера или етк то создавать ли там папку с названием проги и в нее конфиг, или просто в корень каталога прям?

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

>Блендр новые бета версии, всегда идут в архиве с простым бинарником, без установки, тупо вынул, тупо запустил

В Firefox тоже есть такая сборка в один каталог. Но в большинстве дистрибутивов собирают его по-нормальному или же есть ебилды, которые собирают по-нормальному, а в остальных дистрибутивах вообще не собирают Firefox.

Хомякам же будет неудобно пользоваться такими сборками, т.к. придётся руками делать кнопки запуска в меню, на панели, на десктопе, что для них непосильно и не нужно, если установка из пакета проще и всё это в себя включает.

gentoo_root ★★★★★
()
Ответ на: комментарий от LoveGnome

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

Разные пользователи могут настроить у себя программу по-разному (как им удобнее). Всем удобны свои индивидуальные настройки, а не чьи-то, поэтому в общем случае программа настраивается независимо для каждого пользователя и хранит настройки в его домашнем каталоге. Но должны быть и какие-то настройки по умолчанию. Как вариант — брать их из аналогичного конфига в /etc.

Кстати если в кат-юзера или етк то создавать ли там папку с названием проги и в нее конфиг, или просто в корень каталога прям?

В /etc, если один файл, то прям одним файлом можно. Если несколько файлов — то сделать каталог. В ~ класть аналогично, но если установлена $XDG_CONFIG_HOME, но относительно него, а не $HOME. Вот ещё спеки есть, там подробнее и больше к стандарту XDG, чем взагали: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

Ясно. Еще такой вопрос - в etc все практически 99 процентов папок названы прописными буквами втч и имена конфигов, это желание авторов или принцип не называть FolderMeSuperProgramm?

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

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

Вам стоит поменять ник на LoveDOS

korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

>Вам стоит поменять ник на LoveDOS

Не, меня уже убедили, так что не переживайте.

LoveGnome
() автор топика
Ответ на: комментарий от bk_

>Тред убеждения юного ньюби расововерным путям древних Unix-мудрецов.

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

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

>или принцип не называть FolderMeSuperProgramm?

Когда ходишь по таким директориям в консоли, требуется нажимать шифт. Это не так удобно, если честно, потому стараются этого избегать. Хотя кто-то делает.

Ну а на полную спецификацию XDG с её .cache и прочими можно немного забить, т.к. она не так и хороша, да и написана в том числе и Леннартом. Обычно хватает ~/.config/app_name и ~/.local/share/app_name.

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

anonymous
()
Ответ на: комментарий от LoveGnome

Сделай как я. В моей задаче (на Qt) есть два типа настроек. Пользовательские попадают или в ~/.config или в HKCU б-гопротивного реестра в зависимости от платформы. Системные (общие для всех экземпляров программы) хранятся в .ini-шке, путь к которой (у меня сетевой, вида \\share_name\folder\ для шиндовс и /smb-mount-point/ для православных систем) задаётся параметром запуска (--config-dir=<path>). Всё это хозяйство вполне себе успешно живёт на самба-шаре.

Delirium_veritas
()
Ответ на: комментарий от LoveGnome

А мне плевать на твое мнение. Умные люди все уже сказали - мне нечего добавить.

bk_ ★★
()
Ответ на: комментарий от LoveGnome

> ось гламурных блондинок

Буду знать, что линукс для блондинок.

tensai_cirno ★★★★★
()
Ответ на: комментарий от bk_

от юниксовых идей в линуксе мало что осталось. (google `cat -v considered harmful`)

tensai_cirno ★★★★★
()

А почему-бы не подойти к вопросу по-человечески, и не разместить конфиг в ~/.config/app ?

// а еще хочется послать лучи ненависти всем, сохраняющим конфиги в XML!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от gentoo_root

> Не-а, открой для себя настройки программ в «Documents and Settings/%username%» в венде. Многие программы хранят настройки там, остальные в реестре.

В пользовательском реестре, который тоже лежит в «Documents and Settings/%username%».

geekless ★★
()
Ответ на: комментарий от LoveGnome

> Да ну, а вот меня например дико убивает Ogre который

вместо того чтоб хранить свои конфиги в своей папке,

хранит их в папке пользователя.



Вендузятнег? Забыл что в отличие от этого вашего офтопика линукс система многопользовательская? Вот стоит прога в директории /usr/local/чтототам. И что, конфиги туда класть? А для какого юзера?

Вот как раз разбрасывать конфиги хер пойми по каким

директориям вместо того в какой стоит прога и есть бред.



$HOME/.config/ - это место для хранения всех конфигов. То есть место где хранятся настройки конкретного пользователя для поддиректории конкретной программы.

kernel ★★☆
()
Ответ на: комментарий от Yareg

А утечка памяти?

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

Ну и да > Всем_поКуй (c) ЛУркомор

LoveGnome
() автор топика
Ответ на: комментарий от LoveGnome

>> Не бинарный, а нормальный текстовый.

Чем плох хмл? Процессору по...й, для него все битово :)


процессору пох. мне, когда я редактирую этот конфиг руками, не пох совершенно.

val-amart ★★★★★
()
Ответ на: комментарий от LoveGnome

>> А утечка памяти?

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


у меня есть продакшн приложение которое перезапускается раз в 8 часов, при том что запуск занимает ~час и выделено ему 18Гб оперативки. Утечка, да. Правда, в том коде что я показал потеряются считанные байты и только один раз, но конечно не красиво.

val-amart ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.