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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
175
0
312 849
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Найдите страницу руководства для getcwd.

@angad научи человека ловить рыбу, но хотя бы покажи ему путь к озеру / морю / океану :)

mtk 08.10.2015 00:45

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

gbtimmon 22.02.2016 05:55

Фрагмент кода: man 3 getcwd. Шутки в сторону, не будьте анархонистами, этот пост от '08, соглашения SO были другими.

Kroltan 28.06.2016 04:35

@gbtimmon google - это поисковая система, она не аналогична странице руководства. В конечном итоге он будет указывать на страницу руководства.

Ajay Brahmakshatriya 14.07.2017 11:58
Ответ принят как подходящий

Вы смотрели 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;
}

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

Jonathan Leffler 18.11.2008 17:18

О, и не является ли более обычным использование printf (...) вместо fprintf (stdout, ...)?

Jonathan Leffler 18.11.2008 17:18

@JonathanLeffler: Это не самая разборчивая гнида. Это: int main() должен быть int main(void).

Keith Thompson 18.06.2015 02:53

Я бы использовал PATH_MAX из limits.h вместо магического числа, если ~ 4 КБ в стеке не является проблемой.

jacekmigacz 20.01.2017 18:18

По-прежнему не существует, ваш буфер также должен соответствовать байту / нулю завершения строки, поэтому правильным является char cwd[PATH_MAX+1]. Или, если вас не беспокоят буферы, просто char *buf=getcwd(NULL,0);, а когда вы закончите, free(buf) (согласно POSIX.1-2001)

bliako 24.01.2019 23:06

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

Accountant م 27.03.2019 22:27

@bliako Но все еще не там. PATH_MAX не обязательно определяется: «Определение одной из символьных констант в следующем списке должно быть исключено из заголовка <limits.h> в конкретных реализациях, где соответствующее значение равно или больше указанного минимума, но где значение может варьироваться в зависимости от файла для который применяется. Фактическое значение, поддерживаемое для конкретного пути, должно быть предоставлено функцией pathconf() ".

Andrew Henle 04.02.2020 16:57

@Andrew Henle, поэтому я предложил решение без PATH_MAX.

bliako 05.02.2020 17:13

Разве это не должно быть sizeof cwd вместо sizeof(cwd)?

DanielSchreiberMendes 20.04.2020 11:34

В Linux (glibc) get_current_dir_name() немного удобнее (имеет собственный malloc). Я хотел получить только имя каталога, а не весь путь, поэтому я сделал basename(get_current_dir_name()).

Liam 14.10.2020 01:44

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

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

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

Link suggested by user4581301 in a comment to another question, and verified as the current top choice with a Google search 'site:microsoft.com getcurrentdirectory'.

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

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

#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;
}

Почему бы вам не использовать предопределенные макросы для определения ОС, например #if defined (_WIN32) || определено (_WIN64) || определено (ОКНА)

HaseeB Mir 01.11.2018 18:02

-1. Скопированный ответ, оставьте ссылку на оригинальный ответ

Anic17 07.09.2020 12:34

Чтобы получить текущий каталог (в котором вы выполняете свою целевую программу), вы можете использовать следующий пример кода, который работает как для 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;
}

Используйте getcwd

#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;
}

ИЛИ ЖЕ

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

main() {
char *buf;
buf=(char *)malloc(100*sizeof(char));
getcwd(buf,100);
printf("\n %s \n",buf);
}

Другие вопросы по теме