Ich weiß, dass es sehr spät ist, eine Antwort auf diese Frage zu geben, aber ich fand, dass keine der Antworten so nützlich für mich war wie meine eigene Lösung. Ein sehr einfacher Weg, um den Pfad von Ihrem CWD zu Ihrem bin-Ordner zu erhalten, ist wie folgt:
int main(int argc, char* argv[])
{
std::string argv_str(argv[0]);
std::string base = argv_str.substr(0, argv_str.find_last_of("/"));
}
Sie können dies nun einfach als Basis für Ihren relativen Pfad verwenden. So habe ich zum Beispiel diese Verzeichnisstruktur:
main
----> test
----> src
----> bin
und ich möchte meinen Quellcode nach bin kompilieren und ein Protokoll zum Testen schreiben, kann ich einfach diese Zeile zu meinem Code hinzufügen.
std::string pathToWrite = base + "/../test/test.log";
Ich habe diesen Ansatz unter Linux mit vollem Pfad, Alias usw. ausprobiert und er funktioniert einwandfrei.
HINWEIS:
Unter Windows sollten Sie ein "\" als Dateitrennzeichen verwenden, nicht "/". Sie müssen zum Beispiel auch dieses Zeichen entschlüsseln:
std::string base = argv[0].substr(0, argv[0].find_last_of("\\"));
Ich denke, dass dies funktionieren sollte, habe es aber nicht getestet, daher wäre ich für einen Kommentar dankbar, wenn es funktioniert, oder für eine Lösung, wenn nicht.
4 Stimmen
Es sei denn, Sie können den Pfad zuverlässig aus
argv[0]
ist die Technik sehr betriebssystemabhängig.2 Stimmen
Nur zur Klarstellung: Das "aktuelle Verzeichnis" oder "das Verzeichnis, in dem das Programm läuft" (in der Terminologie der Frage) ist das Verzeichnis, in dem sich die Image-Datei des Programms (~.exe-Datei) befindet, und das "aktuelle arbeiten directory' das Verzeichnis ist, das automatisch vervollständigt wird, wenn das Programm relative Pfade verwendet?
4 Stimmen
Wenn Sie
#include <windows.h>
setzt Windows automatisch einechar*
zum ausführbaren Pfad in_pgmptr
. Wenn Sie nur unter Windows arbeiten, brauchen Sie keine zusätzlichen Funktionen aufzurufen und keinen Müll anzunehmen.0 Stimmen
Ist damit Ihre ursprüngliche Frage beantwortet? github.com/gpakosz/whereami
3 Stimmen
Obwohl der Kommentar schon drei Jahre alt ist, möchte ich auf den Kommentar von rsethc zu folgenden Punkten eingehen
_pgmptr
. In der MSDN-Dokumentation heißt es, dass die_pgmptr
y_wpgmptr
Variablen sind veraltet, und Sie sollten die Funktion_get_pgmptr(char**)
o_get_wpgmptr(wchar_t**)
stattdessen. MSDN0 Stimmen
Ich habe die Windows-Version mit Borland C++Builder 6 ausprobiert, die Parameter pBuf und len sind nicht bekannt. Undefiniertes Symbol. Welche Header sollte ich einfügen?
0 Stimmen
Wenn Sie einen modernen Compiler verwenden, sollten Sie die stackoverflow.com/a/60804126/3246135 .