Frage zu ner funktion



  • Hi!
    Ich hab im inet in form einer wrapper klasse diese funktion gefunden:

    std::string md5wrapper::getHashFromFile(std::string filename)	
    {
    	FILE *file;
      	MD5_CTX context;
    
    	int len;
      	unsigned char buffer[1024], digest[16];
    [b]
    	//open file
      	if ((file = fopen (filename.c_str(), "rb")) == NULL)
    	{
    		return "-1";
    	}
    [/b]
    	//init md5
     	md5->MD5Init (&context);
    
    	//read the filecontent
    	while ( (len = fread (buffer, 1, 1024, file)) )
       	{
    		md5->MD5Update (&context, buffer, len);
    	}
    
    	/*
    	generate hash, close the file and return the
    	hash as std::string
    	*/
    	md5->MD5Final (digest, &context);
     	fclose (file);
    	return convToString(digest);
     }
    

    Wenn ich die funktion nun nur mit einem Dateinamen als parameter aufrufe, und sich die datei im ordner meines programms befindet funktioniert das ganze...
    wenn ich nun aber statt des dateinamens einen Pfad angebe bekomm ich immer -1 zurück ....

    Wie bekomm ich die funktion nun dazu nicht nur dateinamen sondern ganze pfade an zu nehmen??

    danke im voraus
    lieben gruß



  • hallo

    zeig mal wie du den pfad uebergibst.

    falls du es so machst:

    call_func("c:\irgendwo\test.dat");
    

    liegt es daran das du den backslash maskieren musst.
    sieht dann so aus:

    call_func("c:\\irgendwo\\test.dat");
    

    Meep Meep



  • ich lass mir den pfad zur exe eines laufenden prozesses mit GetModuleFileNameExA() auslesen, packe das ergebnis dann in einen stringstream um aus dem char array dann einen std::string zu machen. Diesen string übergebe ich dann an die md5 funktion... muss ich da nun die \ auch maskieren?



  • öhm ja .. hab mir die frage selbst beantwortet xD also ich hab mir den pfad mal ausgeben lassen inner konsole und er sieht in etwa so aus "C:\Programme\Bla\Programm.exe"

    also muss ichs maskieren aber wie stell ich das nun an, denn der pfad variiert wahrscheinlich von user zu user



  • gibt es irgendwie die möglichkeit in einem string nach allen \ zu suchen und \\ draus zu machen??



  • Do*natz schrieb:

    gibt es irgendwie die möglichkeit in einem string nach allen \ zu suchen und \\ draus zu machen??

    C oder C++?

    In C++ kannst du im std::strign einfach nach "\" suchen und nach jedem Auffinden durch "\\\" ersetzen.



  • ja geht um c++ und ich benutze std::string also das was du meintest .. und wie genau such ich nun danach? mit welcher subfunktion??



  • also ich hab nun im internet diese funktion gefunden allerdings kann ich damit auch nich nach "\" suchen weil dann das anführungszeichen danach auch nicht erkannt wird und wenn ich nach "\" suche und mit "\\\" ersetzen lassen will werden die \ einfach entfernt 😣

    die funktion:

    std::string ReplaceString(const std::string &stringSearchString, const std::string &stringReplaceString, std::string stringStringToReplace)
    {
            std::string::size_type pos = stringStringToReplace.find(stringSearchString, 0);
            int intLengthSearch = stringSearchString.length();
            int intLengthReplacment = stringReplaceString.length();
    
            while(std::string::npos != pos)
            {
                    stringStringToReplace.replace(pos, intLengthSearch, stringReplaceString);
                    pos = stringStringToReplace.find(stringSearchString, pos + intLengthReplacment);
            }
    
            return stringStringToReplace;
    }
    
    Quelle: Online-Tutorials.net
    


  • ähm ja .. weiss der geier wieso das hier nun auch entfernt wurde aber der text sollte so aussehen:

    also ich hab nun im internet diese funktion gefunden allerdings kann ich damit auch nich nach "\" suchen weil dann das anführungszeichen danach auch nicht erkannt wird und wenn ich nach "\" suche und mit "\\\" ersetzen lassen will werden die \ einfach entfernt 😣

    die funktion:

    std::string ReplaceString(const std::string &stringSearchString, const std::string &stringReplaceString, std::string stringStringToReplace)
    {
            std::string::size_type pos = stringStringToReplace.find(stringSearchString, 0);
            int intLengthSearch = stringSearchString.length();
            int intLengthReplacment = stringReplaceString.length();
    
            while(std::string::npos != pos)
            {
                    stringStringToReplace.replace(pos, intLengthSearch, stringReplaceString);
                    pos = stringStringToReplace.find(stringSearchString, pos + intLengthReplacment);
            }
    
            return stringStringToReplace;
    }
    Quelle Online-Tutorials.net
    


  • okay so gehts auch nich sry für den spam 😣 bei den \ in anführungszeichen fehlt jeweils ein \ .... keine ahnung wieso wenn mans kopiert sind se drin xD



  • hat keiner ne lösung??



  • Das muss nicht mehr extra maskiert werden, die Backslashes musst du nur in eigenen Stringliteralen maskieren. Also so: "C:\\Eigene Dateien" . Wenn du den String von einer funktion bekommst musst du das nicht mehr extra tun. Der Fehler liegt irgendwo anders. Es könnte sein das die exe ausgeführt wird und da ist sie gesperrt. Ob das allerdings auch für den read-Modus gillt weiss ich nicht


Anmelden zum Antworten