2012-11-09 2 views
3

Bonjour, j'ai un problème avec mon code ici.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; 
} 

Vous passez dans le chemin que vous souhaitez utiliser dans les GetFiles (chemin de LPCSTR) Puis-je utiliser la fonction mergestring pour fusionner ensemble le chemin avec un tout extension (\ *. Txt) fonctionne, sauf quand il retourne le LPCSTR alors c'est juste beaucoup de caractères wierd et je ne sais pas pourquoi ou est-ce une meilleure façon de faire cela?

+1

Ceci est votre principal problème: http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

+2

Selon [cette documentation pour la méthode 'c_str'] (http://www.cplusplus.com/reference/string/string/c_str/), la valeur de retour est" uniquement garantie pour rester inchangée jusqu'à l'appel suivant à une fonction membre non constante du objet chaîne. " La destruction de l'objet compte comme une fonction membre non constante, point auquel la valeur renvoyée par 'c_str' n'est plus valide. –

Répondre

5

Votre code est inutilement compliqué. Si vous souhaitez simplement ajouter un suffixe \*.txt à la chaîne du chemin d'entrée, vous pouvez simplement utiliser std::string avec sa surcharge operator+.

Ensuite, si vous voulez passer un std::string à une API Win32 qui a une const char* (c.-à-LPCSTR) paramètre, vous pouvez utiliser std::string::c_str() méthode:

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

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

Notez aussi que dans le monde moderne vous devez utiliser Unicode (UTF-16) pour la programmation Win32; donc const wchar_t* et std::wstring sont de meilleures options que const char* et std::string. En outre, je voudrais simplement utiliser une classe std::wstring comme paramètre, au lieu d'un pointeur wchar_t brut.

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

Votre fonction GetFiles renvoie un pointeur vers la mémoire qui n'est plus valide, File_Data.cFileName ne peut être utilisé dans GetFiles car c'est là File_Data est défini. La solution la plus simple consiste à utiliser la classe de chaînes 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; 
} 

pointeurs est inutilement à l'aide d'une mauvaise habitude d'entrer dans, pour ce genre de raison (tout beaucoup d'autres).

Votre fonction mergeString doit également être réécrite avec moins de pointeurs.

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

    convertedString.insert(i, secondString); 
    return convertedString; 
}