Wie bekomme ich das aktuelle Verzeichnis in einem C-Programm?
Lesezeit: 5 Minuten
Ich mache ein C-Programm, in dem ich das Verzeichnis abrufen muss, aus dem das Programm gestartet wird. Dieses Programm wurde für UNIX-Computer geschrieben. Ich habe mir angesehen opendir() und telldir()aber telldir() gibt a zurück off_t (long int)also hilft mir das nicht wirklich weiter.
Wie kann ich den aktuellen Pfad in einer Zeichenfolge (Char-Array) erhalten?
scheint unnötig zu sein, um die wählerischsten Nits auszuwählen, und das Programm meldet den Erfolg selbst bei einem Fehlschlag über seinen Exit-Status. Ansonsten ein schönes Beispiel.
– Jonathan Leffler
18. November 2008 um 14:18 Uhr
Oh, und ist es konventioneller, printf(…) anstelle von fprintf(stdout, …) zu verwenden?
– Jonathan Leffler
18. November 2008 um 14:18 Uhr
@JonathanLeffler: Das ist nicht die wählerischste Kleinigkeit. Das ist: int main() sollte sein int main(void).
– Keith Thompson
17. Juni 2015 um 23:53 Uhr
Ich würde PATH_MAX aus limits.h anstelle der magischen Zahl verwenden, wenn ~ 4 KB auf dem Stapel kein Problem darstellen.
– jacekmigacz
20. Januar 2017 um 15:18 Uhr
Immer noch nicht da, Ihr Puffer sollte auch das Byte/Null für das Zeichenfolgenende aufnehmen, daher ist es das richtige char cwd[PATH_MAX+1]. Oder wenn Sie einfach keine Lust auf Puffer haben char *buf=getcwd(NULL,0); und wenn du fertig bist free(buf) (ab POSIX.1-2001)
– bliako
24. Januar 2019 um 20:06 Uhr
CAdaker
Schlagen Sie in der Manpage nach getcwd.
@angad einem Mann das Fischen beibringen, aber ihm zumindest den Weg zum See/Meer/Ozean zeigen 🙂
– mtk
7. Oktober 2015 um 21:45 Uhr
Leute, die Menschen empfehlen, die versuchen, die weit überlegene Suchmethode Google zu verwenden, sind aus dem Kontakt.
– gbtimmon
22. Februar 2016 um 2:55 Uhr
Code-Auszug: man 3 getcwd. Spaß beiseite, sei nicht anarchonistisch, dieser Beitrag ist von ’08, also waren Konventionen anders.
– Kroltan
28. Juni 2016 um 1:35 Uhr
@gbtimmon google ist eine Suchmaschine, es ist nicht analog zur Manpage. Es wird schließlich auf die Manpage verweisen.
– Ajay Brahmakshatriya
14. Juli 2017 um 8:58 Uhr
@AjayBrahmakshatriya Der korrekte Google-Begriff lautet “How to get cwd in C++”. Wenn das eine Manpage erhält, ändert sich der Begriff in „How to get cwd in C++ Stack Overflow“.
– Gülzar
1. Dezember 2021 um 12:21 Uhr
Jonathan Leffler
Obwohl die Frage mit Unix gekennzeichnet ist, können die Leute sie auch besuchen, wenn ihre Zielplattform Windows ist, und die Antwort für Windows ist die GetCurrentDirectory() Funktion:
Diese Antworten gelten sowohl für C- als auch für C++-Code.
Der Link wurde von user4581301 in einem Kommentar zu einer anderen Frage vorgeschlagen und mit einer Google-Suche „site:microsoft.com getcurrentdirectory“ als aktuelle Top-Wahl verifiziert.
Es scheint mir nicht, dass das c… oder? LPTSTR?
– floydheld
13. Januar um 9:31 Uhr
@floydheld – Es ist C, aber es verwendet Microsoft Windows-Typnamen. Viele davon sind alle Großbuchstaben (und Zahlen und Unterstriche), im Gegensatz zu den meisten anderen Systemen, bei denen die Typen stattdessen alle Kleinbuchstaben sind (mit einigen Ausnahmen: FILE und DIR bei POSIX-Systemen in den Sinn kommen).
– Jonathan Leffler
13. Januar um 18:31 Uhr
#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;
}
Um das aktuelle Verzeichnis (in dem Sie Ihr Zielprogramm ausführen) abzurufen, können Sie den folgenden Beispielcode verwenden, der sowohl für Visual Studio als auch für Linux/MacOS (gcc/clang), C und C++ funktioniert:
Beachten Sie, dass getcwd(3) ist auch in Microsofts libc verfügbar: getcwd(3)und funktioniert genauso, wie Sie es erwarten würden.
Muss mit verlinken -loldnames (oldnames.lib, was in den meisten Fällen automatisch erfolgt) oder verwenden _getcwd(). Die Version ohne Präfix ist unter Windows RT nicht verfügbar.
eshtox
Verwenden 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;
}
Ihr zweites Beispiel verliert Speicher. Ich bin mir bewusst, dass das Betriebssystem in diesem Fall sowieso den gesamten für den Prozess zugewiesenen Speicher löscht, aber denken Sie daran, dass die Leute, die kommen, den Code kopieren werden, ohne darauf zu achten, dass dies möglicherweise später zu großen Problemen für sie führen wird.
– Omarit
9. November 2021 um 19:19 Uhr
14257800cookie-checkWie bekomme ich das aktuelle Verzeichnis in einem C-Programm?yes