Suchen im CString



  • Hiho,

    ich suche in einem CString die Dateiendung, komme aber nicht richtig
    damit zurecht.

    Mein Ansatz:

    CString strFound ="112244_dddf.doc";
    int posde = strFound.Find('.'); //suche nach dem Punkt
    CString dateiendung=strFound.Right(posde);//lese ab der gefundenen Position nach rechts aus
    

    Alles was er findet ist 44_dddf.doc ? Aber sollte er nicht nur ".doc"
    ausgeben?



  • Lies die Hilfe nochmal genau. 😃
    Oder zähl mal:
    112244_dddf.doc der . ist an Stelle 11.
    Und du bekommst "44_dddf.doc", das sind 11 Zeichen.
    Nämlich die letzten 11 Zeichen des Strings.

    Du musst noch die Stringlänge einberechnen.



  • ich glaub da gabs ne funktion mit namen

    .GetFileExtend()
    

    (geht nur mit CFile glaub ich)

    oder so. Damit sollte das eigentlich klappen.

    oder du gehst so an die sache ran:

    du weißt, dass der extend (die endung) immer 3 zeichen hat. also lässt du dir die Länge des Strings geben (mit GetLength), ziehst die 4 zeichen ab(.doc) und lässt dir dann einfach die restlichen zeichen mit

    .Left(int Count)
    

    ausgeben. Verdammt umständlich aber sollte gehen.

    P.S.
    Hatte ne anstrengende nacht und bin etwas defuse 😉



  • Achja, guck dir Mid an, das ist weniger Rechnerei. 🙂



  • Ja dank euch. Jetzt geht es, dank atoi(..) und .Mid 👍



  • Hallo,
    und wenn die Endung nicht 3 Zeichen lang ist, klappts dann auch? 😕

    Würde das auch gehen:

    CString csDatei = L"datei.jpeg";
    int iPos = csDatei.ReverseFind(L'.');
    CString csEndung = csDatei.Right(iPos);
    // und wenn der Punkt nicht mit in der Endung stehen soll dann eifach 1 weniger extrahieren:
    csEndung = csDatei.Right(iPos - 1);
    

    grüsse
    pixel



  • Afair hat man mit ReverseFind den selben Effekt wie mit Find.
    Es wird nur bei mehreren Punkten im String der letzte und nicht der erste genommen.


  • Mod

    Grundsätzlich sollte man zum Suchen der Dateiendung eine Standardfunktion nutzen:
    WIN32: PathFindExtension
    CRT: _splitpath



  • int iPosExt = csFileName.ReverseFind(_T('.'));
    CString csExtension = csFileName.Mid(iPosExt, (csFileName.GetLength()-iPosExt));
    

    so gehts immer egal wie lang die extension ist und egal in welchen format die datei eingelesen wurde

    man kanns auch weiterfuehren das man Pfad / File / Extension getrennt hat:

    int iPosPath = (csFileName.ReverseFind(_T('\\'))+1);
    CString csPath = csFileName.Mid(0, iPosPath);
    
    int iPosExt = csFileName.ReverseFind(_T('.'));
    CString csExt = csFileName.Mid(iPosExt, (csFileName.GetLength()-iPosExt));
    
    CString csFile = csFileName.Mid(iPos, (iPosExt-iPosPath));
    

    die einzigste voraussetzung ist das ein CString kommt wo es path+file+extension gibt - also wie nach normalen auslesen - wenn es keine extension gibt wird leider csFile leer sein und der dateiname bei csExt sein, kann man aber abfangen wie man moechte


Anmelden zum Antworten