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?

Benutzeravatar von Mic
Mikrofon

Hast du mal angeschaut getcwd()?

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

Einfaches Beispiel:

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

  • 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

Benutzeravatar von CAdaker
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

Benutzeravatar von Jonathan Leffler
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:

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

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:

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

Benutzeravatar von rvx
rvx

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.

Benutzeravatar von eeshtox
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;
}

ODER

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

  • 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

1425780cookie-checkWie bekomme ich das aktuelle Verzeichnis in einem C-Programm?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy