2012-11-09 4 views
3

안녕하세요, 여기에 내 코드에 문제가 있습니다. 당신은 경로에 통과FindFirstFile LPCSTR

LPCSTR mergeString(LPCSTR firstString, std::string secondString) 
{ 
    string convertedString = ConvertString(firstString); 
    LPCSTR mergedString; 
    int i = convertedString.size(); 

    convertedString.insert(i, secondString); 
    mergedString = (convertedString.c_str()); 

    return mergedString; 
} 

void GetFiles(LPCSTR path) 
{ 
    WIN32_FIND_DATA File_Data; 
    LPCSTR lPath = mergeString(path,"\\*.txt"); 
    FindFirstFile(lPath, &File_Data); 
    wcout << File_Data.cFileName; 
} 

당신은 GetFiles에 (LPCSTR 경로) 그럼이 확장 (\ *. TXT) 모든 것이가를 반환하는 경우를 제외하고 작동과 함께 경로를 병합 할 mergestring 기능을 사용에 사용할 LPCSTR 다음 그냥 이상한 문자 및 많은 이유를 모르거나이 일을 더 좋은 방법은 무엇입니까? File_Data가 정의 된 곳이기 때문에 귀하의 GetFiles 기능은 더 이상 유효 메모리에 대한 포인터를 반환

+1

이 주요 문제 : http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

+2

[이 문서에 따르면 'c_str' 메쏘드] (http://www.cplusplus.com/reference/string/string/c_str/)에서 리턴 값은 "다음 번에 일정하지 않은 멤버 함수를 호출 할 때까지 변경되지 않고 유지 될 것입니다. 문자열 개체. " 객체를 파기하면 상수가 아닌 멤버 함수로 계산됩니다.이 시점에서'c_str'에 의해 반환 된 값은 더 이상 유효하지 않습니다. –

답변

5

코드는 복잡 불필요하게이다. 입력 경로 문자열에 \*.txt 접미사를 추가하려는 경우 std::string에 오버로드 된 operator+을 사용하면됩니다. 또한 현대 세계에서 유니 코드를 사용한다

void GetFiles(LPCSTR path) 
{ 
    WIN32_FIND_DATA fileData; 
    std::string searchPath(path); 
    searchPath += "\\*.txt"; 

    FindFirstFile(searchPath.c_str(), &fileData); 
    wcout << fileData.cFileName; 
} 

참고 : const char* (즉 LPCSTR) 매개 변수가있는 Win32 API를에 std::string를 전달하려면

그런 다음, 당신은 std::string::c_str() 방법을 사용할 수 있습니다 (UTF-16) Win32 프로그래밍; 따라서 및 std::wstringconst char*std::string보다 나은 옵션입니다. 또한 wchar_t 포인터 대신 매개 변수로 std::wstring 클래스를 사용합니다.

void GetFiles(const std::wstring& path) 
{ 
    std::wstring searchPath = path + L"\\*.txt"; 
    WIN32_FIND_DATA fileData; 
    FindFirstFile(searchPath.c_str(), &fileData); 
    std::wcout << fileData.cFileName; 
} 
0

File_Data.cFileNameGetFiles 사용할 수 있습니다. 가장 간단한 해결책은 C++ 문자열 클래스 std::string을 사용하는 것입니다.

std::string GetFiles(LPCSTR path) 
{ 
    WIN32_FIND_DATA File_Data; 
    LPCSTR lPath = mergeString(path,"\\*.txt"); 
    FindFirstFile(lPath, &File_Data); 
    return File_Data.cFileName; 
} 

사용하여 포인터는 불필요 이유는 이런 종류의 (어떤 더 많은)에 대해,로 얻을 수있는 나쁜 습관이다.

mergeString 함수도 적은 수의 포인터로 다시 작성해야합니다.

std::string mergeString(LPCSTR firstString, std::string secondString) 
{ 
    string convertedString = ConvertString(firstString); 
    int i = convertedString.size(); 

    convertedString.insert(i, secondString); 
    return convertedString; 
} 
관련 문제