Aus Fullname (char) nur Pfadangaben



  • Hallo,

    ich brauche aus einem Fullname nur den Pfad.
    Zum Beispiel:

    Aus

    C:\log\xyz.log

    soll werden

    C:\log\*

    Gibt es da eine Funktion die mir das abnimmt oder muss ich da selber was schreiben.
    Die Funktion PathRemoveFileSpec() gibt bei mir einen Fehler und würde auch das "\*" nicht an den Pfad hängen.

    #define DEFAULT_LOG_FILE_NAME    "C:\\log\\xyz.log"
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	const char*	pszLog;
    	pszLog = DEFAULT_LOG_FILE_NAME;
    
    	//PathRemoveFileSpec(pszLog);
    
    	//string test = pszLog;
    
    	printf("STringtest =  %s\n",pszLog);
    
    	getch();
    	return 0;
    }
    


  • Hi,
    etwas fertiges gibts nur in ner OS Api (splitpath, etc).
    kopiere doch einfach das ganze in ein Array, suche mit strrchr den Backslash und schreib dein Sternchen da rein.

    Gruß,
    B.B.



  • Irgendwie komme ich nicht weiter.

    Ich weiß jetzt wo das letzte '\' im C-String steht. Aber wie ich nun die nachfolgenden Zeichen durch ein * ersetzte keinen Peil.

    const char * pch;
    	pch=strrchr(pszLog,'\\');
    	printf ("Letzte Zeichen '\\' gefunden an %d Stelle \n",pch-pszLog+1);
    


  • Einfach für die ganze restliche Länge in den String schreiben.

    for(i=posBackslash+1;i<strlen(myString);++i) {
      myString[i]='*';
    }
    

    So oder so ähnlich... 😉



  • Meine letzte Post war etwas missverständlich.
    Ich möchte gerne alles was nach dem Letzten \ steht löschen so das nur noch ein * im Pfad steht. Siehe Post 1



  • Dabudai schrieb:

    Meine letzte Post war etwas missverständlich.
    Ich möchte gerne alles was nach dem Letzten \ steht löschen so das nur noch ein * im Pfad steht. Siehe Post 1

    Dann ist es doch noch einfacher. Einfach an Position [BackslashPosition+1] ein '*' und dahinter eine 0 schreiben.



  • Ich hasse CStrings.
    Ich hab es C++Strings genommen. Ist zwar vllt. nicht schön aber ich habe das was ich will.
    Wenn es einer schöner kann, kann er es hier posten.

    const char*	pszLog;
    	pszLog = DEFAULT_LOG_FILE_NAME;
    
    	const char * pch;
    	pch=strrchr(pszLog,'\\');
    	printf ("Last occurence of '\\' found at %d \n",pch-pszLog+1);
    
    	string s1 = pszLog;
    	string s2;
    	s2 = s1.substr(0,pch-pszLog+1)+'*';
    
    	//printf("STringtest =  %s\n",s1.c_str());
    	//printf("STringtest2 =  %s\n",s2.c_str());
    
    	const char *newname = s2.c_str();
    
    	printf("STringtest =  %s\n",newname);
    


  • Hi,

    Dabudai schrieb:

    Wenn es einer schöner kann, kann er es hier posten.

    ich kanns schöner Bruder, guckst du letzten Post von _matze 🙂



  • Dann lass mich bitte nicht summ sterben, und zeig doch bitte eine Beispiel oder die Funktionen welche ich benötige.



  • Wenn du sowieso C++ machst, dann kannst du auch die Funktionen fuer Strings in C++ benutzen. Z.B. rfind. Mittels substr kannst du dann den ganzen vorderen Teil in einen neuen String packen.



  • Dabudai schrieb:

    Dann lass mich bitte nicht summ sterben, und zeig doch bitte eine Beispiel oder die Funktionen welche ich benötige.

    //z.B. so:
    myString[BackslashPos+1]='*';
    myString[BackslashPos+2]=0;
    
    //oder auch so:
    strcpy(&myString[BackslashPos+1],"*");
    


  • Dabudai schrieb:

    Dann lass mich bitte nicht summ sterben, und zeig doch bitte eine Beispiel oder die Funktionen welche ich benötige.

    Ok, Bruder, guckst du:

    const char* fname =  "C:\\log\\xyz.log";
    
    int main()
    {
    	char buf[FILENAME_MAX+1] = {0};
    	char* p;
    	strncpy(buf, fname, FILENAME_MAX );
    	p = strrchr(buf, '\\');
    	if ( *(p+1) == 0 ) return 0; // * passt nicht, fname zu lang.
    	if (p) *(p+1) = '*', *(p+2) = 0;
    	puts(buf);
    	return 0;
     }
    

    Gruß,
    B.B.



  • Verflixt zuviel los hier heute :D, das war noch nix, hier der korrigierte main Teil:

    char buf[FILENAME_MAX+1] = {0};
    	char* p;
    	strncpy(buf, fname, FILENAME_MAX );
    	p = strrchr(buf, '\\');
    	if(!p) return 0; // Keinen Backslash gefunden.
    	if ( *(p+1) == 0 ) return 0; // * passt nicht, fname zu lang.
    	*(p+1) = '*', *(p+2) = 0;
    


  • Da ist immer noch n Bug drin 😃 mal sehn, ob es jemand merkt :xmas2:



  • Big Brother schrieb:

    Da ist immer noch n Bug drin 😃 mal sehn, ob es jemand merkt

    hier, bugfrei und ganz primitiv:

    void get_path (char *in, char *out)
    {
      char *bs;
      for (bs=0; *in; in++)
      {
        *out++ = *in;
        if (*in == '\\')
          bs = out;
      }
      if (bs)
        out = bs;
      *out = 0;
    }
    

    ^^^muss nur noch ein sternchen drangehängt werden.
    🙂


Anmelden zum Antworten