2010-05-19 2 views
15

현재 작업 디렉토리를 얻으려면 플랫폼 간 방법이 필요합니다 (예, 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에서도 잘 작동해야합니다. 맞습니까?

UPDATE :

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

답변

12

NULL 버퍼가있는 getcwd을 호출 할 수 없습니다. Opengroup 기준 :

buf가 null 포인터이면 getcwd()의 동작이 지정되지 않습니다.

또한 getcwd는 문자열 생성자를 손상시킬 수있는 NULL을 반환 할 수 있습니다. 언급해야

char buffer[SIZE]; 
char *answer = getcwd(buffer, sizeof(buffer)); 
string s_cwd; 
if (answer) 
{ 
    s_cwd = answer; 
} 
+2

그가 Windows, Linux 및 Max OS X와의 호환성에 "관심이있는"경우 'getcwd (NULL)'이 잘 정의되어 있습니다. 그들은 모두 같은 방식으로 기능을 확장합니다. –

+0

나는 이것을 받아 들였지만 위의 설명은 정확하다. 내 코드는 메모리 누수가 있었으므로 해결해야합니다. – rubenvb

+0

@RobKennedy - Linux의 경우 대상 버전에 따라 다릅니다. 예를 들어, RHEL5 상자에서'getcwd (NULL)'은 정의되지 않은 것으로 문서화됩니다. –

25

: 뭔가가 (에 getcwd에 대한 괜찮은 길이를 얻을 수있는 더 적절한 방법이 없기 때문에 나는 정해진 길이의 문자 배열을 만들지 않도록하기 위해 노력하고있어) 아직 여기 잘못 두려워 포함 할 문제가없는 경우 편리한 플랫폼 간 파일 시스템 작업을 위해 boost filesystem을 사용하십시오.

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

여기는 example입니다.

편집 : 코멘트에 로이 덴톤에 의해 지적, 파일 시스템은 ISO C++ in C++17의 일부가되었다, 그래서 부스트는 더 이상 필요하지 않습니다 :

std::filesystem::current_path(); 
+0

:

당신이 좋아하는 뭔가 그것을 변경해야합니다, 외부 종속성을 제한하려고 그래서 아무 부스트하시기 바랍니다. – rubenvb

+4

아, 그래.) 다른 사람들이이 질문에 비틀 거릴 경우를 대비하여이 주석을 남길 것입니다.) – catchmeifyoutry

+2

C++ 14/C++ 17부터'std :: filesystem :: current_path()': http : // en을 사용할 수 있습니다. cppreference.com/w/cpp/filesystem/current_path –

2

구현이 정의되는 NULL 포인터 getcwd를 호출. malloc (코드가 메모리 누수가있는 경우)을 사용하여 할당 할 때가 많습니다. 그러나 전혀 작동하지 않을 수도 있습니다. 따라서 자신의 버퍼를 할당해야합니다.

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

오픈 그룹에는 _PC_PATH_MAX에서 최대 경로 길이를 얻는 방법을 보여주는 예제가 있습니다. Windows에서 MAX_PATH을 사용할 수 있습니다. 두 플랫폼 모두에서이 번호에 대한주의 사항은 this question을 참조하십시오.

+0

std :: string 생성자가 malloc의 메모리를 해제하지 않습니까? – rubenvb

+0

@rubenvb, 아니요, 그냥 문자열을 복사본으로 초기화합니다. 전달 된'char * '가 어떻게 할당되었는지를 알 수있는 방법이 없다. –

+0

Dang, OK, thanks – rubenvb

관련 문제