【问题标题】:FindFirstFile LPCSTRFindFirstFile LPCSTR
【发布时间】:2012-10-29 23:57:22
【问题描述】:

您好,我的代码有问题。

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,然后它只是很多奇怪的角色,我不知道为什么或者这是更好的方法吗?

【问题讨论】:

标签: c++ windows string winapi lpcstr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的代码不必要地复杂。 如果您只想在输入路径字符串中添加\*.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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 2015-11-11
      • 2010-09-24
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2018-10-18
      相关资源
      最近更新 更多