Как получить текущий каталог в программе на языке Си?

Как получить текущий каталог в программе на языке Си?

18.11.2008 02:36:29 Просмотров 56 Источник

Я делаю программу на языке Си, где мне нужно получить каталог, из которого запускается программа. Эта программа написана для компьютеров UNIX. Я смотрел на opendir()и telldir(), но telldir()возвращает off_t (long int), так что это действительно не помогает мне.

Как я могу получить текущий путь в строке (массив символов)?

У вопроса есть решение - Посмотреть?

Ответы - Как получить текущий каталог в программе на языке Си? / How to get the current directory in a C program?

CAdaker

18.11.2008 02:37:30

Посмотрите на man-страницу для getcwd.

https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298516#comment53830834_298516
@ angad научи человека ловить рыбу, но, по крайней мере, покажи ему путь к озеру / морю / океану :)
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298516#comment58778851_298516
людей, рекомендующих человека пытаются использовать значительно улучшенный метод поиска Google никак не связаны.
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298516#comment63570050_298516
Фрагмент кода: man 3 getcwd. Шутки в сторону, не будь анархистом, этот пост из ' 08, так что условности были другими.
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298516#comment77169257_298516
@gbtimmon google-это поисковая система, она не является аналогом man-страницы. В конечном счете это будет указывать на страницу man.
Является ответом!
Mic

18.11.2008 02:38:24

Вы уже смотрели на getcwd()?

#include <unistd.h>
char *getcwd(char *buf, size_t size);

Простой пример:

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

int main() {
   char cwd[PATH_MAX];
   if (getcwd(cwd, sizeof(cwd)) != NULL) {
       printf("Current working dir: %s\n", cwd);
   } else {
       perror("getcwd() error");
       return 1;
   }
   return 0;
}
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment144955_298518
Выбирая самую придирчивую из гнид, h> кажется ненужным, и программа сообщает об успехе даже в случае неудачи через свой статус выхода. В остальном-хороший пример.
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment144959_298518
О, А разве более привычно использовать printf(...) вместо fprintf (stdout,...)?
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment49847241_298518
@JonathanLeffler: это не самая придирчивая гнида. Это: int main() должны быть int main(void).
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment70725129_298518
Я бы использовал PATH_MAX от limits.h, вместо магического числа, если ~4KB на стеке не является проблемой.
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment95524165_298518
Все еще не там, ваш буфер должен также вместить для строки-завершения байт/null, поэтому правильный-char cwd[PATH_MAX+1]. Или, если вы не можете быть обеспокоены буферами, просто char *buf=getcwd(NULL,0);и когда вы закончите free(buf)(начиная с POSIX.1-2001)
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment97491973_298518
Если я запускаю программу из cron, эта функция не возвращает каталог программы, как ожидалось.
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment106219059_298518
@bliako но все еще не там. PATH_MAXне обязательно определяется : "определение одной из символьных констант в следующем списке должно быть опущено из <limits.h>заголовок на конкретных реализациях, где соответствующее значение равно или больше заявленного минимума, но где значение может изменяться в зависимости от файла, к которому оно применяется. Фактическое значение, поддерживаемое для конкретного имени пути, должно быть предоставлено функцией pathconf()."
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/298518#comment106253871_298518
@Andrew Henle, вот почему я предложил решение без PATH_MAX.
Jonathan Leffler

18.07.2015 05:39:43

Хотя вопрос помечен как Unix, люди также могут посетить его, когда их целевой платформой является Windows, и ответом для Windows является функция GetCurrentDirectory():

DWORD WINAPI GetCurrentDirectory(
  _In_  DWORD  nBufferLength,
  _Out_ LPTSTR lpBuffer
);

Эти ответы применимы как к C, так и к C++ коду.

Ссылка, предложенная пользователем 4581301 в комментарии к другому вопросу, и подтвержденная как текущий лучший выбор с помощью поиска Google 'site:microsoft.com getcurrentdirectory'.

rvx

23.10.2017 10:01:58

Обратите внимание , что getcwd(3)также доступен в libc Microsoft: getcwd(3) и работает так же, как вы ожидали.

Необходимо связать с -loldnames(старые имена.lib, что в большинстве случаев делается автоматически), или использовать _getcwd(). Неподфиксированная версия недоступна в Windows RT.

Jevgenij Kononov

19.12.2017 01:39:39

#include <stdio.h>  /* defines FILENAME_MAX */
//#define WINDOWS  /* uncomment this line to use it for windows.*/
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

int main(){
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  printf("Current working dir: %s\n", buff);
  return 1;
}
https://stackoverflow.com/questions/298510/how-to-get-the-current-directory-in-a-c-program/47877476#comment93103084_47877476
Почему бы вам не использовать pre_defined макросы для определения ОС как #если определен(_WIN32) || определенными(_WIN64) || определенными(для Windows)
HaxtraZ

04.02.2020 04:25:43

Чтобы получить текущий каталог (в котором выполняется целевая программа), можно использовать следующий пример кода, который работает как для Visual Studio, так и для Linux/MacOS (gcc / clang), как C, так и C++:

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

#if defined(_MSC_VER)
#include <direct.h>
#define getcwd _getcwd
#elif defined(__GNUC__)
#include <unistd.h>
#endif

int main() {
    char* buffer;

    if( (buffer=getcwd(NULL, 0)) == NULL) {
        perror("failed to get current directory\n");
    } else {
        printf("%s \nLength: %zu\n", buffer, strlen(buffer));
        free(buffer);
    }

    return 0;
}
Закрыть X