Как я получаю каталог, от которого работает программа?

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

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

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

259
задан casperOne 14 February 2013 в 01:53
поделиться

11 ответов

Вот код для получения полного пути к выполняющемуся приложению:

Windows:

int bytes = GetModuleFileName(NULL, pBuf, len);
if(bytes == 0)
    return -1;
else
    return bytes;

Linux:

char szTmp[32];
sprintf(szTmp, "/proc/%d/exe", getpid());
int bytes = MIN(readlink(szTmp, pBuf, len), len - 1);
if(bytes >= 0)
    pBuf[bytes] = '\0';
return bytes;
173
ответ дан 23 November 2019 в 02:39
поделиться

Повысьте Файловую систему initial_path(), ведет себя как POSIX getcwd(), и ни один не делает то, что Вы хотите отдельно, но добавление argv[0] любому из них должно сделать это.

можно отметить, что результат не всегда симпатичен - можно получить вещи как /foo/bar/../../baz/a.out или /foo/bar//baz/a.out, но я полагаю, что он всегда приводит к допустимому пути, который называет исполняемый файл (обратите внимание, что последовательные наклонные черты в пути сворачиваются к одному).

я ранее записал решение с помощью envp (третий аргумент main(), который работал над Linux, но не казался осуществимым в Windows, таким образом, я по существу рекомендую то же решение, как кто-то еще сделал ранее, но с дополнительным объяснением того, почему это на самом деле корректно, даже если результаты не симпатичны.

0
ответ дан John Zwinck 23 November 2019 в 02:39
поделиться

На платформах POSIX можно использовать getcwd () .

В Windows, можно использовать _getcwd () как использование , getcwd () был удержан от использования.

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

0
ответ дан Fruny 23 November 2019 в 02:39
поделиться

Вы не можете использовать argv [0] с этой целью, обычно он действительно содержит полный путь к исполняемому файлу, но не nessesarily - процесс мог быть создан с произвольным значением в поле.

Также ум Вы, текущий каталог и каталог с исполняемым файлом - две разных вещи, таким образом, getcwd () не поможет Вам также.

В Windows используют GetModuleFileName (), в чтении Linux/dev/proc / procID/.. файлы.

6
ответ дан eugensk 23 November 2019 в 02:39
поделиться

Возможно, свяжите текущий рабочий каталог с argv [0]? Я не уверен, работало ли это в Windows, но он работает в Linux.

, Например:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv) {
    char the_path[256];

    getcwd(the_path, 255);
    strcat(the_path, "/");
    strcat(the_path, argv[0]);

    printf("%s\n", the_path);

    return 0;
}

, Когда выполнено, это производит:

jeremy@jeremy-desktop: ~/Desktop$./тест
/home/jeremy/Desktop/./test

8
ответ дан Jeremy Ruten 23 November 2019 в 02:39
поделиться

Нет, нет никакого стандартного пути. Я полагаю, что стандарты C/C++ даже не рассматривают существование каталогов (или другие организации файловой системы).

В Windows GetModuleFileName () возвратит полный путь исполняемому файлу текущего процесса, когда параметр hModule будет установлен на ПУСТОЙ УКАЗАТЕЛЬ . Я не могу помочь с Linux.

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

9
ответ дан Michael Burr 23 November 2019 в 02:39
поделиться

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

getcwd является функцией POSIX и поддерживаемый из поля всем POSIX совместимые платформы. Вы не должны были бы делать ничего специального (кроме incliding правильные заголовки unistd.h на Unix и direct.h на окнах).

, Так как Вы создаете программу C, она свяжет со значением по умолчанию c библиотеку времени выполнения, которая связана со ВСЕМИ процессами в системе (специально обработанные исключения, которых избегают) и она будет включать эту функцию по умолчанию. CRT никогда не считают внешней библиотекой, потому что это предоставляет основной норме совместимый интерфейс ОС.

окна On getcwd функция был удержан от использования в пользу _getcwd. Я думаю, что Вы могли использовать его этим способом.

#include <stdio.h>  /* defines FILENAME_MAX */
#ifdef WINDOWS
    #include <direct.h>
    #define GetCurrentDir _getcwd
#else
    #include <unistd.h>
    #define GetCurrentDir getcwd
 #endif

 char cCurrentPath[FILENAME_MAX];

 if (!GetCurrentDir(cCurrentPath, sizeof(cCurrentPath)))
     {
     return errno;
     }

cCurrentPath[sizeof(cCurrentPath) - 1] = '\0'; /* not really required */

printf ("The current working directory is %s", cCurrentPath);
164
ответ дан Community 23 November 2019 в 02:39
поделиться

Если Вы хотите стандартный путь без библиотек: Нет. Целое понятие каталога не включено в стандарт.

, Если Вы соглашаетесь, что некоторая (портативная) зависимость от почти стандартного lib хорошо: Пользуйтесь библиотека файловой системы Повышения и попросите initial_path () .

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

29
ответ дан Thorsten79 23 November 2019 в 02:39
поделиться

Поскольку Win32 GetCurrentDirectory должен добиться цели.

7
ответ дан Torbjörn Gyllebring 23 November 2019 в 02:39
поделиться
-

Просто к заподерзничному кучу здесь, ...

Нет стандартного решения, потому что языки агностики основных файловых систем, так как другие сказали, концепция файловой системы на основе каталога находится за пределами объема языков C / C ++.

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

3
ответ дан 23 November 2019 в 02:39
поделиться

Как упоминалось Minok , не существует такого функциональности, указанного INI C Standard или стандарт C ++. Это считается чисто определенной особенностью, и она указана в стандарте POSIX, например.

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

Хорошая альтернатива, которую я бы порекомендовал бы собрать 100% заголовков библиотек STLSOFT C ++ Matthew Wilson (автор должны читать книги о C ++). Существует Portable Facade PlatformSTL, дает доступ к системе API: Winstl для Windows и Unixstl на Unix, поэтому он является портативным решением. Все системные элементы указываются с использованием черт и политик, поэтому она расширяется структура. Существует предоставленная библиотека файловой системы.

0
ответ дан 23 November 2019 в 02:39
поделиться