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





Найдите страницу руководства для getcwd.
люди, рекомендующие человека людям, пытающимся использовать гораздо более совершенный метод поиска Google, находятся вне пределов досягаемости.
Фрагмент кода: man 3 getcwd. Шутки в сторону, не будьте анархонистами, этот пост от '08, соглашения SO были другими.
@gbtimmon google - это поисковая система, она не аналогична странице руководства. В конечном итоге он будет указывать на страницу руководства.
#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> кажется ненужным, и программа сообщает об успехе даже в случае неудачи через статус выхода. В остальном хороший пример.
О, и не является ли более обычным использование printf (...) вместо fprintf (stdout, ...)?
@JonathanLeffler: Это не самая разборчивая гнида. Это: int main() должен быть int main(void).
Я бы использовал PATH_MAX из limits.h вместо магического числа, если ~ 4 КБ в стеке не является проблемой.
По-прежнему не существует, ваш буфер также должен соответствовать байту / нулю завершения строки, поэтому правильным является char cwd[PATH_MAX+1]. Или, если вас не беспокоят буферы, просто char *buf=getcwd(NULL,0);, а когда вы закончите, free(buf) (согласно POSIX.1-2001)
Если я запустил программу с cron, эта функция не вернет каталог программы, как ожидалось.
@bliako Но все еще не там. PATH_MAX не обязательно определяется: «Определение одной из символьных констант в следующем списке должно быть исключено из заголовка <limits.h> в конкретных реализациях, где соответствующее значение равно или больше указанного минимума, но где значение может варьироваться в зависимости от файла для который применяется. Фактическое значение, поддерживаемое для конкретного пути, должно быть предоставлено функцией pathconf() ".
@Andrew Henle, поэтому я предложил решение без PATH_MAX.
Разве это не должно быть sizeof cwd вместо sizeof(cwd)?
В Linux (glibc) get_current_dir_name() немного удобнее (имеет собственный malloc). Я хотел получить только имя каталога, а не весь путь, поэтому я сделал basename(get_current_dir_name()).
Хотя вопрос помечен как 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) || определено (ОКНА)
-1. Скопированный ответ, оставьте ссылку на оригинальный ответ
Чтобы получить текущий каталог (в котором вы выполняете свою целевую программу), вы можете использовать следующий пример кода, который работает как для 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);
}
@angad научи человека ловить рыбу, но хотя бы покажи ему путь к озеру / морю / океану :)