Probleme mit eigener Funktion



  • Hallo erstmal 🙂

    Ich hab da ein Problem mit ein paar Funktionen in meinem Programm. Leider kann ich nicht genau ausmachen, WO das Problem liegt.

    Hier mal die Codezeilen für das einlesen der Highscore Datei das schreiben dieser und das verschlüsseln der Daten.

    void Highscore::read()
    {
    	char scorepfad[MAX_PATH];
    	GetCurrentDirectory(MAX_PATH, scorepfad);
    	ldatei.open(strcat (scorepfad, "\\highscore.hsc"), ios_base::in);
    
    	for(int i = 0; i < 10; i++)
    	{
    		getline(ldatei, score[i]);
    		score[i] = crypt(score[i], "downtimes", false);
    	}
    
    	ldatei.close();
    
    }
    
    string Highscore::crypt(string inp, string key, bool mode)
    {
    	string z, cptstring, str1;
    	char c;
        unsigned int position = 0;
        int cptzahl, orgzahl, keyzahl;
        for(unsigned int i = 0; i < inp.length(); i++)
        {
    
        	strcpy(&c, (str1.assign(key, position, 1).c_str()));
            keyzahl = c;
    
            position++;
            if(position > key.length())
            		position = 1;    
    
            if(mode)
            {
                //Verschlüsseln
                strcpy(&c, (str1.assign(inp, i, 1).c_str()));
                orgzahl = c;
                cptzahl = orgzahl ^ keyzahl;
                ostringstream Str;
                Str << cptzahl;
                cptstring = Str.str();
                if(cptstring.length() < 2)
                	cptstring = "0" + cptstring;
                z += cptstring;
            }
            else
            {            
                //Entschlüsseln
            	cptstring.assign(inp, i, 2).c_str();
            	i++;
                cptzahl = atoi(cptstring.c_str());
                orgzahl = cptzahl ^ keyzahl;
                c = orgzahl;
                z += c;
            }
        }
    
        return z;
    
    };
    
    void Highscore::write(string name, int punkte)
    {
    	char scorepfad[MAX_PATH];
    	GetCurrentDirectory(MAX_PATH, scorepfad);
    
    	string p;
    	ostringstream Str;
        Str << punkte;
        p = Str.str();
    
        while(p.length() < 10)
        {
        	p += " ";
        }
    
    	for(int i = 9; i > pos; i--)
    	{
    		score[i] = score[i - 1];
    	}
    	score[pos] = name + p;
    
    	sdatei.open(strcat (scorepfad, "\\highscore.hsc"), ios_base::out);
    	for(int i = 0; i < 10; i++)
    	{
    		score[i] = crypt(score[i], "downtimes", true);
    		sdatei << (score[i] + "\n");
    	}
    
    	sdatei.close();
    
    	read();
    
    };
    

    Wenn ich das Programm auf meinem eignen PC in der IDE laufen lasse tut alles Einwandfrei. Schicke ich das Projekt aber nun zu einem Freund mit gleichem Betriebsystem usw und er führt es aus dann bekommt er in der Ausgabe teilweise richtige und teilweise falsche Zeichen ausgegben. Er besitzt aber die gleiche "highscore.hsc" Datei wie ich auch.

    Hat einer eine Ahnung woran dieser Unterschied zwischen ihm und mir liegen könnte?

    Vielen dank schonmal im Voraus für jegliche Hilfe

    MFG downtimes



  • Was soll die Funktion

    strcpy(&c, (str1.assign(key, position, 1).c_str()));
    

    bewirken?
    Du weist einem einzelnen char einen string zu... (Speicherüberschreiber)

    Und die Umwandlung der Zeichen in Zahlen verstehe ich auch nicht.
    Normalerweise wird einfach der Text zeichenweise mit dem Key verschlüsselt/entschlüsselt.



  • Schien wohl wahrlich an betreffender Codezeile zu liegen.

    Das kommt davon, wenn man sich als neuling an so sachen wagt 🙂

    Danke für die Hilfe mittlerweile habich nen besseren Weg gefunden mein Problem zu realisieren

    MFG downtimes



  • Vielen Dank, hab das ganze jetzt komplett umgeschrieben und es funktioniert jetzt.
    Sieht so aus:

    [code]
    void Highscore::split(string source, const char* delimeter, string array[])
    {
    	int j = 0, k = -1;
    	unsigned int i = 0;
    	string str;
    	i = source.find(delimeter, i + 1);
    	while(i != string::npos)
    	{
    		array[j] = str.assign(source, k + 1, i - (k + 1));
    		j++;
    		k = i;
    		i = source.find(delimeter, i + 1);
    	}
    }
    
    void Highscore::read()
    {
    	char scorepfad[MAX_PATH];
    	GetCurrentDirectory(MAX_PATH, scorepfad);
    	ldatei.open(strcat (scorepfad, "\\highscore.hsc"), ios::binary);
    
    	ldatei.seekg(0, ios::end);
    	size_t len = ldatei.tellg();
    	ldatei.seekg(0, ios::beg); 
    
        char* buf = new char[len];
        ldatei.read(buf, len);
    
    	ldatei.close();
    
    	string str = crypt(buf, "downtimes", false, len);
    
    	delete[] buf;
    
    	split(str, "~", &score[0]);
    
    }
    
    void Highscore::write(string name, int punkte)
    {
    	char scorepfad[MAX_PATH];
    	GetCurrentDirectory(MAX_PATH, scorepfad);
    
    	string p;
    	ostringstream Str;
    	Str << punkte;
    	p = Str.str();
    
    	for(int i = 19; i > pos; i--)
    	{
    		score[i] = score[i - 2];
    		i--;
    		score[i] = score[i - 2];
    	}
    
    	score[pos * 2] = name;
    	score[pos * 2 + 1] = p;
    
    	string s;
    
    	for(int i = 0; i < 20; i++)
    	{
    		s += score[i];
    		s += "~";
    	}
    
    	char* buf = new char[s.size()];
    	strcpy(buf, s.c_str());
    
    	s = crypt(buf, "downtimes", true, s.size());
    	strcpy(buf, s.c_str());
    
    	sdatei.open(strcat (scorepfad, "\\highscore.hsc"), ios::binary | ios_base::trunc);
    
    	sdatei.write(buf, s.size());
    	sdatei.close();
    
    	delete[] buf;
    
    };
    
    string Highscore::crypt(char* inp, string key, bool mode, int len)
    {
    	string z;
    	char c;
        unsigned int position = 0;
        int cptzahl, orgzahl, keyzahl;
        for(int i = 0; i < len; i++)
        {
    
        	strcpy(&c, key.substr(position, 1).c_str());
            keyzahl = c;
    
            position++;
            if(position > key.length())
            		position = 0;    
    
            if(mode)
            {
                //Verschlüsseln
                orgzahl = inp[i];
                cptzahl = orgzahl ^ keyzahl;
                z += cptzahl;
            }
            else
            {   
            	//Entschlüsseln
                cptzahl = inp[i];
                orgzahl = cptzahl ^ keyzahl;
                z += orgzahl;
            }
        }
        return z;
    };
    [/code]
    

Anmelden zum Antworten