3

こんにちは、ここでコードに問題が発生しました。

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を返す場合を除いて、すべてが機能します。奇妙なキャラクターと私は理由がわかりませんか、それともこれを行うためのより良い方法ですか?

4

2 に答える 2

5

あなたのコードは不必要に複雑です。\*.txt入力パス文字列にサフィックスを追加するだけの場合std::stringは、オーバーロードされoperator+た .

次に、 (ie ) パラメータstd::stringを持つ Win32 API に aを渡したい場合は、次のメソッドを使用できます。const char*LPCSTRstd::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;
}

また、現代の世界では、Win32 プログラミングに Unicode (UTF-16) を使用する必要があることに注意してください。soconst wchar_t*とはandstd::wstringよりも優れたオプションです。さらに、生のポインターではなく、クラスをパラメーターとして使用するだけです。const char*std::stringstd::wstringwchar_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;
}
于 2012-11-09T16:52:36.663 に答える
0

あなたのGetFiles関数は、もはや有効ではないメモリへのポインタを返しています。それが定義されているため、File_Data.cFileNameでのみ使用できます。最も簡単な解決策は、C++文字列クラスを使用することです。GetFilesFile_Datastd::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;
}
于 2012-11-09T16:27:31.447 に答える