FindFirstFile LPCSTR

时间:2012-11-09 16:21:49

标签: c++ windows string winapi 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路径)然后我使用mergestring函数将路径与扩展名(\ * .txt)合并在一起所有工作都有效,除非它返回LPCSTR然后它只是很多奇怪的角色,我不知道为什么或这是一个更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:5)

您的代码不必要复杂。 如果您只想在输入路径字符串中添加\*.txt后缀,则只需使用std::string及其重载的operator+

然后,如果您想将std::string传递给具有const char*(即LPCSTR)参数的Win32 API,则可以使用std::string::c_str()方法:

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

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

另请注意,在现代世界中,您应该使用Unicode(UTF-16)进行Win32编程;因此const wchar_t*std::wstring是比const char*std::string更好的选择。 此外,我只使用std::wstring类作为参数,而不是原始wchar_t指针。

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

答案 1 :(得分:0)

您的GetFiles函数返回一个指向不再有效的内存的指针,File_Data.cFileName只能在GetFiles中使用,因为那是File_Data定义的地方。最简单的解决方案是使用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;
}