2009-10-11 10 views
2

Hey j'essaie d'extraire le chemin du fichier, mais le problème est que je suis coincé dans une boucle infinie ne comprends pas pourquoi. S'il vous plaît jeter un oeil à mon code.CString extrait le chemin du fichier

CString myString(_T("C:\\Documents and Settings\\admin\\Desktop\\Elite\\Elite\\IvrEngine\\dxxxB1C1.log")); 

int pos = myString.Find(_T("\\")); 

while (pos != -1) 
{ 
    pos = myString.Find(_T("\\"), pos); // it keeps returning 2 
} 

CString folderPath = myString.Mid(pos); 

Maintenant, le problème est que, FIND() retourne 2 la première fois que je lance, mais dans la boucle alors qu'il revient sans cesse 2, pourquoi la fonction incapable de trouver le reste « \ »? Donc maintenant je suis dans une boucle infinie :(

Répondre

1

CString::Find retourne toujours la première occurrence du caractère que vous recherchez.Il continue à trouver le premier "\\" qui est à l'index 2 infiniment depuis que vous cherchez de 2, qui comprend que "\\"

3

on dirait Find comprend le caractère à la position que vous donnez lors de la recherche. donc, si vous lui donnez la position d'un caractère qui correspond à la recherche, puis il retournera cette même position.

Vous devez probablement le changer pour:

pos = myString.Find(_T("\\"), pos + 1); 
1

Vous pouvez corriger le code (voir les réponses pos + 1) mais je pense que vous devriez utiliser _splitpath_s à la place qui était destiné à ce type d'opérations.

1

Je peux comprendre votre implémentation initiale, car le comportement de CString :: Find() semble avoir changé avec le temps.

Jetez un coup d'œil aux documents MSDN pour l'implémentation MFC livrés avec VC6 here et à l'implémentation actuelle here. Surtout regarder les différences de la description du 2ème paramètre de décalage.

La solution à votre problème est, comme déjà indiqué ci-dessus, d'ajouter 1 au décalage de recherche des appels Find() successifs. Vous pouvez également rechercher des caractères simples (ou wchar_ts) comme ça:

myString.Find(_T('\\'), pos+1); 

EDIT:

BTW, jetez un oeil à l'familliale Path* des fonctions exposées par le shlwapi.dll, a déclaré dans shlwapi.h . En particulier, la fonction PathRemoveFileSpec pourrait vous intéresser.

3

votre code ne fonctionnera jamais! Lorsque la boucle while est terminée, le contend de pos ne peut pas être utilisé. Voici une solution qui fonctionnera:

CString folderPath; 
int pos = myString.ReverseFind('\\'); 
if (pos != -1) 
{ 
    folderPath = myString.Left(pos); 
} 
1

dans MFC, par exemple pour obtenir le dossier qui, y compris le fichier exécutable:

char ownPth[MAX_PATH]; 

// Will contain exe path 
HMODULE hModule = GetModuleHandle(NULL); 
if(NULL == hModule){ 
    return __LINE__; 
} 

// When passing NULL to GetModuleHandle, it returns handle of exe itself 
GetModuleFileName(hModule,ownPth, (sizeof(ownPth))); 
modulePath = (LPCSTR)ownPth; 
modulePath = modulePath.Left(modulePath.ReverseFind(_T('\\'))); 

return 0; 
Questions connexes