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). Затем я использую функцию mergestring, чтобы объединить путь с расширением (\*. Txt), все работает, кроме случаев, когда он возвращает LPCSTR, тогда его просто много странные персонажи и я не знаю почему или это лучший способ сделать это?

2 ответа

Решение

Ваш код излишне сложен. Если вы просто хотите добавить \*.txt суффикс строки входного пути, вы можете просто использовать std::string с его перегруженным operator+,

Затем, если вы хотите передать std::string к Win32 API, который имеет const char* (т.е. LPCSTR), вы можете использовать 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;
}

Ваш 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;
}
Другие вопросы по тегам