23

現在の作業ディレクトリを取得するためのクロスプラットフォームの方法が必要です (はい、getcwd は私が望むことを行います)。私はこれがうまくいくかもしれないと思った:

#ifdef _WIN32
    #include <direct.h>
    #define getcwd _getcwd // stupid MSFT "deprecation" warning
#elif
    #include <unistd.h>
#endif
#include <string>
#include <iostream>
using namespace std;

int main()
{
    string s_cwd(getcwd(NULL,0));
    cout << "CWD is: " << s_cwd << endl;
}

私はこの読書を得ました:

メモリ リークはなく、Mac でも動作するはずですよね?

更新:ここでまだ何かが間違っているのではないかと心配しています(getcwdに適切な長さを取得する適切な方法がないため、決定された長さでchar配列を作成しないようにしています):

char* a_cwd = getcwd(NULL,0);
string s_cwd(a_cwd);
free(a_cwd); // or delete a_cwd? 
4

3 に答える 3

27

含めても問題ない場合は、クロスプラットフォームのファイルシステム操作に便利なboost ファイルシステムを使用してください。

boost::filesystem::path full_path( boost::filesystem::current_path() );

ここにがあります。

編集: コメントで Roi Danton が指摘したように、ファイルシステムはC++17 の ISO C++の一部になったため、ブーストはもう必要ありません:

std::filesystem::current_path();
于 2010-05-19T19:28:54.323 に答える
14

getcwdNULL バッファーで呼び出すことはできません。オープングループによると:

buf が NULL ポインターの場合、getcwd() の動作は規定されていません。

また、getcwd は NULL を返す可能性があり、文字列コンストラクターを破壊する可能性があります。

これを次のように変更する必要があります。

char buffer[SIZE];
char *answer = getcwd(buffer, sizeof(buffer));
string s_cwd;
if (answer)
{
    s_cwd = answer;
}
于 2010-05-19T19:32:08.100 に答える
2

NULL ポインターを使用してgetcwdを呼び出すことは、実装によって定義されます。多くの場合、malloc を使用して割り当てを行います (この場合、コードにメモリ リークがあります)。ただし、まったく動作することを保証するものではありません。したがって、独自のバッファを割り当てる必要があります。

char *cwd_buffer = malloc(sizeof(char) * max_path_len);
char *cwd_result = getcwd(cwd_buffer, max_path_len);

Open Group には、_PC_PATH_MAX から最大パス長を取得する方法を示す例があります。Windows でMAX_PATHを使用することを検討できます。両方のプラットフォームでのこの数の注意事項については、この質問を参照してください。

于 2010-05-19T19:32:05.987 に答える