fstream .put() und .get() Befehl - Zuweisung?
-
Guten Morgen C++ Gemeinde.
Ich versuche mich gerade an einem Programm, welches Dateien kopiert, und währenddessen verschlüsselt, da ich hier noch rel. neu bin, und ich derzeit noch durch ein Buch lerne, und ich gerade nicht weiterkomme, wollte ich fragen, was denn mein Problem im Programm ist? Ich möchte eine Datei 'verschlüsseln' die nur ein 'A' hat (kein anderen Buchstaben, die erst danach^^), wenn ich das aber Versuche, geht die Datei nur leer raus, und versuche ich mit Zählvariablen nachzusehen wie viel er eigentlich hätte kopieren müssen, sind viel mehr da, als im Dokument stehen (0).PS: Mein eigtl. Programm ist wesentlich größer, jedoch wollte ich mich aufs Grundgerüst beschränken.
Edit: Vollen Code eingefügt.
Code:
#include <fstream> #include <cstdlib> #include <iostream> #include <string> using namespace std; int main() { ifstream quelle; string quellname; cout << "Gib die Datei an, die verschluesselt werden soll." << endl; cout << "Dateiname: "; cin >> quellname; quelle.open(quellname.c_str(), ios::binary|ios::in); if(!quelle) { cout << "Die Datei " << quellname << " konnte nicht gefunden werden." << endl; cout << "Beachte, dass die Datei im selben Ordner, wie das Programm sein muss!" << endl; exit(-1); } string zielname; cout << "Wie soll die verschluesselte Datei heissen?" << endl; cout << "Dateiname: "; cin >> zielname; ofstream ziel(zielname.c_str(), ios::binary|ios::out); if(!ziel) { cerr << "Das Ziel existiert nicht!" << endl; } char ch, s; short c = 0; long long a = 0, b = 0; while(quelle.get(s)) { c = 1; if(c = 1) { switch(s) { case 'A': s = 'J'; break; case 'a': s = 'P'; break; case 'B': s = 'p'; break; case 'b': s = 'C'; break; case 'C': s = 'H'; break; case 'c': s = 'k'; break; case 'D': s = 'M'; break; case 'd': s = 'V'; break; case 'E': s = 'y'; break; case 'e': s = 'x'; break; case 'F': s = 'l'; break; case 'f': s = 's'; break; case 'G': s = 'O'; break; case 'g': s = 'T'; break; case 'H': s = 'a'; break; case 'h': s = 'q'; break; case 'I': s = 'd'; break; case 'i': s = 'e'; break; case 'J': s = 'i'; break; case 'j': s = 'z'; break; case 'K': s = 'g'; break; case 'k': s = 'K'; break; case 'L': s = 'Z'; break; case 'l': s = 'ü'; break; case 'M': s = 'v'; break; case 'm': s = 'r'; break; case 'N': s = 'm'; break; case 'n': s = 'E'; break; case 'O': s = 'f'; break; case 'o': s = 'Y'; break; case 'P': s = 'W'; break; case 'p': s = 'h'; break; case 'Q': s = 'B'; break; case 'q': s = 'ä'; break; case 'R': s = 'Ü'; break; case 'r': s = 'o'; break; case 'S': s = 'Ä'; break; case 's': s = 't'; break; case 'T': s = 'c'; break; case 't': s = 'G'; break; case 'U': s = 'ö'; break; case 'u': s = 'b'; break; case 'V': s = 'L'; break; case 'v': s = 's'; break; case 'W': s = 'n'; break; case 'w': s = 'Ö'; break; case 'X': s = 'j'; break; case 'x': s = 'U'; break; case 'Y': s = 'R'; break; case 'y': s = 'u'; break; case 'Z': s = 'I'; break; case 'z': s = 'D'; break; case 'Ä': s = 'A'; break; case 'ä': s = 'F'; break; case 'Ö': s = 'W'; break; case 'ö': s = 'N'; break; case 'Ü': s = 'X'; break; case 'ü': s = 'Q'; break; case '!': s = '<'; break; case '"': s = ')'; break; case '§': s = '}'; break; case '$': s = ']'; break; case '%': s = '/'; break; case '&': s = '>'; break; case '/': s = '&'; break; case '(': s = '?'; break; case ')': s = '#'; break; case '=': s = '"'; break; case '+': s = '('; break; case '-': s = '%'; break; case '{': s = ';'; break; case '}': s = '{'; break; case '[': s = '*'; break; case ']': s = '´'; break; case '_': s = '²'; break; case '`': s = ';'; break; case '´': s = '^'; break; case '~': s = '³'; break; case '²': s = 'ß'; break; case '³': s = '°'; break; case '^': s = '.'; break; case '°': s = '='; break; case ':': s = 'ß'; break; case '.': s = '`'; break; case ';': s = '_'; break; case ',': s = 'µ'; break; case '1': s = '9'; break; case '2': s = '6'; break; case '3': s = '1'; break; case '4': s = '8'; break; case '5': s = '0'; break; case '6': s = '2'; break; case '7': s = '4'; break; case '8': s = '3'; break; case '9': s = '7'; break; case '0': s = '5'; break; case 'ß': s = '!'; break; default: s = ' '; break; ziel.put(s); } a = a + 1; b = b + 1; if(a == 10) { cout << b << " Zeichen wurden bereits verschluesselt." << endl; a = 0; } } c = 0; } return 0; }
Könnte mir vielleicht jemand auf die Sprünge helfen?
Danke schonmal im Voraus,
Shortyoo!
-
In Deinem gezeigten Programmfragment wird nichts in die Zieldatei geschrieben!?
-
Ich habe ein Problem. Ich zeig aber nicht den Code, sondern einen anderen mit anderen Fehlern. Könnt ihr mir helfen?
Nein!
-
manni66 schrieb:
Ich habe ein Problem. Ich zeig aber nicht den Code, sondern einen anderen mit anderen Fehlern. Könnt ihr mir helfen?
Klar doch!
Dazu musst du aber nochmal ne andere andere Version deines Codes posten, inklusive Beschreibung eines ganz anderen Problems das dir eigentlich komplett egal ist.@Shortyoo
Voraus wird nicht zensiert, wenn man es richtig schreibt.
-
manni66 schrieb:
Ich habe ein Problem. Ich zeig aber nicht den Code, sondern einen anderen mit anderen Fehlern. Könnt ihr mir helfen?
Nein!
Echt cool. Er hat ein Problem, beschreibt es, aber der Beispielcode hat mit dem nichts zu tun. Und jetzt erwartet er, dass jemand das Problem in dem Code erkennt, den er nicht zeigt.
-
Wie ihr alle hetzt, dass es nicht der richtige Programmcode ist?
Es ist ein Ausschnitt davon, ist doch sinnlos wenn ich's noch für die restlichen Buchstaben hinschreibe, obwohl es mir erst mal nur um einen geht - weils allgemein gar nicht geht?
Sinnlos.@Belli,
Hatte ich nur vergessen noch hin zuzuschreiben, Sorry!
-
ifstream quelle; char quelldateiname; quelle.open(quelldateiname.c_str(), ios::binary|ios::in);
bitte was?
1. native typen haben keine methoden. char ist ein nativer typ und c_str() ist ein methodenaufruf. meinst dustd::string
?
2. normal öffnet man einen dateistream im konstruktor und schliesst ihn im destruktor. spart tipparbeit, ist übersichtlicher und besserer stil (besserer stil weil du ihn erst dann anforderst wenn du ihn auch brauchst).
3. dasin
-flag bei einemistream
anzugeben kannst du dir sparen. das ist so oder so IMMER gesetzt beiistreams
.char zieldatei; ofstream ziel(zieldatei.c_str(), ios::binary|ios::out);
hier analog tipp 1 und 3 von oben beachten.
while(quelle.get(s)) { switch(s) { [...]
bitte macht dir eine lookup-tabelle statt so ein riesiges
switch
-ding, das macht alles viel leserlicher.ps.: ändere den code im ersten post bitte nicht andauernd. sonst kann man sich nie auf etwas fixes beziehen.
-
Das
if(c = 1)
soll was tun?
-
Nimm put aus dem switch heraus.
-
Oh verdammt!
Wollte eigentlich string nehmen, ja, vielleicht liegts nur daran...
Das mit Konstruktor und Destruktor hatte ich noch nicht, sollte aber bald kommen.
Mit dem In-flag weiß ich nicht was du meinst, ios::binary|ios::in bzw. out?Was ist eine Look-Up Tabelle?
if(c = 1)
Ich dachte, dass das Programm zu schnell ist, deswegen wollt ich, dass das Programm erst einmal den if-Befehl abläuft, und die While Schleife "hängt".
Das mit dem Put versuche ich auch mal, danke!
Edit: Das mit dem Put war es, danke!Edit:
Es funktioniert jetzt, bis auf dass er kein Zeilenumbruch macht, was sollte ich da versuchen?
-
einfach eine
std::map
bei dir für jedes zeichen ein anderes zeichen hinterlegt ist:std::map<char, char> LookUpTbl; LookUpTbl['A'] = 'J'; // ... for(; Quelle; Ziel << LookUpTbl[Quelle.get()]);
da kannst du je nach dem noch ein bisschen dran rumwerkeln. wenn du nicht alle möglichen zeichen in der map hast dann rufst du eben
std::map::find()
auf (statt den subscript-operator) und prüfst ob der iterator gültig ist.
-
Shortyoo schrieb:
Es funktioniert jetzt, bis auf dass er kein Zeilenumbruch macht, was sollte ich da versuchen?
Zeilenumbrüche nicht durch Leerzeichen ersetzen.
-
Also das mit der Map kann ich noch nicht, denke ich.^^
@MFK Okay, danke.
Edit:
Funktioniert jetzt, danke!
-
Shortyoo schrieb:
Wie ihr alle hetzt, dass es nicht der richtige Programmcode ist?
Es ist ein Ausschnitt davon, ist doch sinnlos wenn ich's noch für die restlichen Buchstaben hinschreibe, obwohl es mir erst mal nur um einen geht - weils allgemein gar nicht geht?
Sinnlos.Da hat noch wesentlich mehr gefehlt als "die restlichen Buchstaben". Eben genau die Stellen wo du Fehler gemacht hast.
Was sinnlos ist kannst du dir jetzt selbst überlegen. Und damit meine ich nicht deinen verständlichen Ärger über die Form in der die Unzulänglichkeiten deines Beispielcodes an dich herangetragen wurden (ja, auch von mir).
Sondern dass du einfach behauptest dass ja eh nur unwesentliche Dinge gefehlt haben. Und dass du deinen Beispielcode nichtmal ausprobiert hast. Wenn du nicht weisst wo der Fehler ist, weiso nimmst du dann an zu wissen wo er nicht ist? Und wenn du - was offensichtlich ist - nicht so gut C++ programmieren kannst, wieso nimmst du dann an beurteilen zu können, ob ein kleiner Codeausschnitt, den du mal eben so hingetippst hast, den Fehler den du suchst reproduziert, ohne es ausprobiert zu haben?