Problem mit XOR und Schreiben in Datei
-
Hallo.
Ich habe ein Problem beim Dateischreiben von Strings, die mit dem XOR Operator "verschlüsselt" wurden.
Ich habe einen Schlüssel, der ein Buchstabe ist. Dabei tritt immer bei einem bestimmten Buchstaben als Schlüssel ein Fehler auf.
Wenn ich als Schlüssel z.B. 'z' nehme, dann gibt es Probleme mit dem 's' in den Wörtern, wenn ich als Schlüssel 'a' nehme, tritt das Problem bei 'l' auf.Und zwar sieht das dann so aus, dass ich dann z.B. bei 'z' als Schlüssel 'Hase' eingebe und 'Haz' rausbekomme. Also ersetzt er immer einen bestimmten Buchstaben und bricht danach ab.
Hier ein kleines Testprogramm von mir, wo der Fehler immer auftritt:
#include <iostream> #include <string> #include <fstream> int main() { std::fstream file; std::string input; std::string output; std::string readString; std::string writeString; char key = 'a'; input.clear(); output.clear(); readString.clear(); writeString.clear(); std::cout << "Eingabe: "; std:: cin >> input; for(unsigned int i=0;i<=input.length();i++) { writeString += input[i] ^ key; }; file.open("XOR.dat", std::fstream::out); if(file){ file.clear(); }; file << writeString; file.close(); file.open("XOR.dat", std::fstream::in); file >> readString; file.close(); for(unsigned int i=0;i<=readString.length();i++) { output += readString[i] ^ key; }; std::cout << output; return 0; };Weiß jemand, warum der Fehler auftritt und was ich da tun kann?
Wenn ich das nur mit Strings teste, also ohne diese in eine Datei zu schreiben und wieder auszulesen, dann tritt der Fehler nicht auf. Es scheint also daran zu liegen, dass die Strings in die Datei geschrieben und dann wieder ausgelesen werden.MfG
Hundefutter
-
leigt wahrscheinlich am \0 was das ende des strings ist. -> std::vector<char>
-
ich w[rde sagen schrieb:
leigt wahrscheinlich am \0 was das ende des strings ist.
Was hat das denn damit zu tun?
Ich denke eher, es könnte damit zusammenhängen, dass nicht für jedes Zeichen nach der Verschlüsselung wieder ein eindeutiges Zeichen entsteht. Im String selber mag das vielleicht noch gehen, aber wenn man in eine Textdatei schreibt, ist es eben unterschiedlich, was herauskommt. Gerade bei bestimmten Escapesequenzen muss es nicht sein, dass das Gelesene 1:1 dem Geschriebenen entspricht.
Ich würde deshalb entweder einen Algorithmus entwickeln, der einen Buchstaben wiederum in einen Buchstaben verschlüsselt, oder es mit Ganzzahlen machen und somit auch Zahlen in die Textdatei schreiben.
-
#include <iostream> #include <string> #include <fstream> #include <sstream> #include <stdio.h> int main() { std::fstream file; std::stringbuf buf; std::string input; std::string output; std::string readString; std::string writeString; char key = 'z'; input.clear(); output.clear(); readString.clear(); writeString.clear(); std::cout << "Eingabe: "; std:: cin >> input; for(unsigned int i=0;i<input.length();i++) { writeString += input[i] ^ key; }; file.open("XOR.dat", std::fstream::out); if(file){ file.clear(); }; file << writeString; file.close(); file.open("XOR.dat", std::fstream::in); file >> &buf; file.close(); readString=buf.str(); for(unsigned int i=0;i<readString.length();i++) { output += readString[i] ^ key; }; std::cout << output; return 0; };
-
Vielen Dank sothis_, das funktioniert perfekt :).
Stringbuf kannte ich noch gar nicht..
Ich muss noch viel lerne, was das ganze Dateimanagement und Strings angeht, aber da ist ja schon mal wieder etwas neues in mein Köpfchen eingedrungen.MfG
Hundefutter
-
Nexus schrieb:
ich w[rde sagen schrieb:
leigt wahrscheinlich am \0 was das ende des strings ist.
Was hat das denn damit zu tun?
das
std::string res; res+=char('t'^'p'); res+=char('e'^'a'); res+=char('s'^'s'); res+=char('t'^'s'); std::cout << res;
-
Bei deinem Code liegt aber so einiges im Argen.
Hier mal in schöner:
#include <iostream> #include <string> #include <fstream> #include <sstream> int main() { const char key = 'z'; std::cout << "Eingabe: "; std::string input; while( !std::getline( std::cin, input ) ) { std::cout << "Ooops that was wrong. Try it again.\nEingabe: " << std::flush; } std::string writeString; for(unsigned int i=0;i<input.length();i++) { writeString += input[i] ^ key; } std::fstream file("XOR.dat", std::fstream::out); if(!file) { std::cerr << "Could not open file" << std::endl; return 1; } file << writeString; file.close(); file.open("XOR.dat", std::fstream::in); if( !file ) { std::cerr << "Could not open file" << std::endl; return 1; } std::stringbuf buf; file >> &buf; std::string readString( buf.str() ); std::string output; for(unsigned int i=0;i<readString.length();i++) { output += readString[i] ^ key; } std::cout << output; return 0; }
-
Hallo nochmal.
Habe jetzt noch ein weiteres Problem.
Lese jetzt mit stringbuf ein:std::stringbuf buf; file >> &buf; std::string input = buf.str();Das funktioniert soweit auch ganz gut, nur habe ich das Problem, dass wenn ich mehrere Einträge in der Datei habe, er immer nur den ersten Eintrag liest..
Habes es nun mit
while(file >> &buf) { //... }probiert, nur leider liest er so nur den ersten Eintrag in der Datei, auch wenn mehrere vorhanden sind..
Bei mehreren Einträgen hat es mit
while(file >> input) { //... }immer gut funktioniert, nur die Lösung mit dem Stringbuf hat da wohl ein Problem.
Wie kann ich nun mit den Stringbuf arbeiten und auch mehrere Strings aus der Datei lesen?MfG
Hundefutter
-
Weiß denn keiner, wie ich mehr als immer nur den ersten Eintrag aus der Datei bekomme?
Schreibe die Zeilen mitHighscoreFile << output << std::endl;in die Datei und will dann die einzelnen Zeilen wieder auslesen..
Wie gesagt, mit
while(file >> &buf) { //... };geht es leider nicht, da nimmt er immer nur den ersten Eintrag.
MfG
Hundefutter
-
Schau mal
std::getline()fürstd::stringbzw.std::fstream::getline()fürchar*an...
-
std::getline() funktioniert mit den Strings sehr gut. Vielen Dank!
MfG
Hundefutter