fstream: Mehrfachdurchläufe auf eine Datei? 2 Fragen!



  • Guten Abend C++ Gemeinde,
    1.
    Wie schon im Titel steht, wollte ich fragen, ob es möglich ist, ein "Verschlüsselungsprogramm" mehrmals auf eine Datei auszuführen ist, bei einem Durchlauf? Bsp:
    Text.txt soll 10x verschlüsselt werden, alles in der Datei Text1.txt geschrieben.

    Geht das?

    Mein Programm sieht jetzt so aus, wobei ich von Text.txt (Ausgangsform) zum Ifstream Text1.txt bzw. Text2.txt, und beim Ofstream auch von Text1.txt zu Text2.txt springe, nur, egal welche Zahl ich eingabe, Text2.txt bleibt immer leer, Text1.txt bleibt immer nur einfach verschlüsselt. Woran liegt das? Code ist hier:

    #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 A, s; //Antworter für Soll Datei, Nehmer der Buchstaben
        short e = 0; //Soll Datei mehrfach verschlüsselt werden?
        long long a = 0, b = 0, f = 0; //Wortzähl Variablen
        unsigned short d = 0, c = 0; //Anzahl der Verschlüsselungen, Wechsel zwischen ofstream mehrfach und zieldateiname.
        string mehrfach;
    
        cout << "Soll die Datei mehrfach verschlüsselt werden?\nBitte nur mit 'J' oder 'N' antworten." << endl;
        cout << "Eingabe: ";
        cin  >> A;
        switch(A){
            case 'J':
                e = e + 1;
                break;
            case 'N':
                e = 0;
                break;
            default:
                e = 0;
                break;
        }
        if(e == 1){
        cout << "Wie oft soll die Datei verschlüsselt werden?" << endl;
        cout << "Eingabe: " << flush;
        cin  >> d;
        cout << "Gib einen weiteren Dateinamen an, um die mehrfach Verschlüsselung zu ermöglichen." << endl;
        cout << "Dateiname: ";
        cin  >> mehrfach;
        ofstream Ziel(mehrfach.c_str(), ios::binary|ios::out);
        if(!ziel){
            cout << "Das zweite Ziel existiert nicht!" << endl;
            exit(-1);
        }
        }
        else{
            cout << "Datei wird nur einmal verschluesselt." << endl;
        }
    
        ofstream Ziel(zielname.c_str(), ios::binary|ios::out);
    
        MehrfachNichtErreicht:
        while(quelle.get(s))
        {
            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 '*': 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;
            }
            ziel.put(s);
            a = a + 1;
            b = b + 1;
            f = f + 1;
            if(c == 0){
                c = 1;
            }
            else if (c == 1){
                c = 0;
            }
            if(a == 10)
            {
                cout << b << " Zeichen wurden bereits verschluesselt." << endl;
                a = 0;
            }
        }
        if(!quelle.get(s) && f < d){
            if(c == 0){
                quelle.close();
                quelle.clear();
                quelle.open(mehrfach.c_str(), ios::binary|ios::in);
                ofstream Ziel(zielname.c_str(), ios::binary|ios::out);
                goto MehrfachNichtErreicht;
            }
            else if(c == 1){
                quelle.close();
                quelle.clear();
                quelle.open(zielname.c_str(), ios::binary|ios::in);
                ofstream Ziel(mehrfach.c_str(), ios::binary|ios::out);
                goto MehrfachNichtErreicht;
            }
        }
        if(f == d)
        {
            cout << "Die Datei wurde " << f << " mal verschlüsselt." << endl;
        }
        return 0;
        cin.get();
    }
    

    Habe etwas viele Variablen genutzt, wollte aber erstmal auf der sicheren Seite seien!

    Danke schonmal im Voraus! 🙂



  • Unverändert. Hast evtl die BB-Codes in Deinem Profil abgeschaltet.

    #include <fstream>
    ...
    

    edit: Code wieder entfernt, TO hat ja nachgerüstet, muss nicht doppelt stehen.



  • Ouh danke, hab mich schon gewundert warum das so ist, dachte es ist zu viel Text. 🙂



  • Shortyoo schrieb:

    Guten Abend C++ Gemeinde,
    1.
    Wie schon im Titel steht, wollte ich fragen, ob es möglich ist, ein "Verschlüsselungsprogramm" mehrmals auf eine Datei auszuführen ist, bei einem Durchlauf? Bsp:
    Text.txt soll 10x verschlüsselt werden, alles in der Datei Text1.txt geschrieben.

    Geht das?

    Klar. Mir RAII wäre das sogar trivial. Dein Open-Close-Zeugs macht es komisch.

    Übrigens: Wenn ich recht sehe, wendest Du nur einen Vertauschungsschlüssel an, wo je ein Zeichen durch genau ein anderes ersetzt wird. Zehnmal einen solchen Vertauschungsschlüssel anzuwenden ist genau Nullkommanullnull sicherer, als ihn nur einmal anzuwenden.

    Die Zehnmaligkeit erzeugt ja nur auch einen Vertauschungsschlüssel. Den knackt man in Millisekunden, falls irgendwas über den Klartext bekannt ist, wie "Ist Deutscher Text", "Ist Word-Dokument" oder so.



  • Naja, mir gings ja erst einmal darum, so was überhaupt zu machen, da ich noch rel. neu in C++ bin - und außerdem finde ich es eine nette Spielerei, wie sich der Text verändert fasziniert mich halt jetzt schon. d:

    Was meinst du mit RAII?



  • Shortyoo schrieb:

    Naja, mir gings ja erst einmal darum, so was überhaupt zu machen, da ich noch rel. neu in C++ bin - und außerdem finde ich es eine nette Spielerei, wie sich der Text verändert fasziniert mich halt jetzt schon. d:

    Das finde ich gut. 👍

    Shortyoo schrieb:

    Was meinst du mit RAII?

    Statt open/close verwendest Du Konstruktor/Destruktor.

    Gegebenenfalls wird dazu ein zu destruierendes Objekt eigens in einen eigenen Block gepackt, damit meine ich, es wird eigens ein Block mit { und } drumgebaut.
    Ist aber allermeistens eh hinfällig, weil man die Gesamtaufgabe ja in kleinere Funktionen (ein Zweck -> eine Funktion) zerlegt und genau da ja automatisch der Block ist, mithin temporäre Objekte, die nur zu einem Zwecke kurz da sind, nur innerhalb der einen Zweckfunktion leben.



  • Ich sehe bei Dir exit und open/close.
    exit ist in C++ eine Todsünde (ehrlich!).
    open/close ist als veraltet anzusehen, sinnlos umständlich, fehleranfällig.

    Haste etwa ein sehr schlechtes C++-Lehrbuch gerade in Händen? Vielleicht eins von Jürgen Wolf? Welches haste gerade in Deinen Fängen?



  • Naja ich lerne C++ derzeitig über ein Buch, hab schon kurz was über Kon- und Destruktoren gelesen, aber ich verstehe den Sinn dabei nicht. :o

    Warum klappt das denn eigtl. mit dem Mehrfachaustausch nicht?



  • Shortyoo schrieb:

    Naja ich lerne C++ derzeitig über ein Buch, hab schon kurz was über Kon- und Destruktoren gelesen, aber ich verstehe den Sinn dabei nicht. :o

    Googele mal nach RAII. Ok, hartes Brot, sorry.

    Halte uns auf dem Laufenden über deinen neuen Code-Versionen. Erstmal ist RAII und funktionale Zerlegung das Wichtigste.

    Wenn es sich Dir nicht erschließt, wird SeppJ eine lehrreiche Metapher finden, die alles klar macht. Eigentlich müßte man seine Metaphern in sammeln und ein Buch drüber rausgeben.

    Shortyoo schrieb:

    Warum klappt das denn eigtl. mit dem Mehrfachaustausch nicht?

    Sorry, ich mag das nicht durchdenken, ich glaube, daß Du diesen Pfad schnell verlassen solltest.

    Wenn Du "Bitte, bitte" postest, kläre ich das auch. Aber wäre für und beide verschwendete Zeit. Für mich ein paar Minuten, für Dich ein paar Wochen, weil Du Dich in einen Stil vertiefen würdest, der nicht oberschlau ist, fürchte ich.

    ps: Welches Buch? Brauche ich für meine persönliche Statistik, welche Bücher (nicht) taugen.



  • Der C++ Programmierer derzeit, hatte davor 2 andere
    1. C++ Programmierung für Anfänger (Florian Wollenschein)
    2. C++ OOP von Anfang an (OOP ausgeschrieben) (Helmut Erlenkötter)

    Zum 'Der C++ Programmierer' ich finde es nützlicher als die anderen beiden, hier wurde z.B. erklärt warum man z.B. den Iostream braucht, in den anderen beiden Büchern wars so nach dem Motto "Weil isso", so schlecht ist es gar nicht, hat auch Hintergrundinformationen - nun gut, bin noch nicht weit, aber derweil besser als die anderen, bin eigtl. nur auf die Aufgabe gekommen weil dort kurz darauf eingegangen wurde wie man bspw. Dateien kopiert (fstream Zeugs), hab mir den Austausch dann selbst zur Aufgabe gemacht, also sooo schlecht ist es dann doch nicht, Konstruktor und Destruktor kommen jetzt auch bald. 🙂

    Naja, ich vertrau dir mal - im Sinne von das es unnütz wäre - trotzdem danke ich dir schon mal für deine Hilfe. 🙂

    Grüße, Shortyoo



  • Mir RAII wäre das sogar trivial.

    Das ist sehr unspezifisch. In C ist es wahrscheinlich auch super trivial.

    volkard schrieb:

    exit ist in C++ eine Todsünde (ehrlich!).

    Ja, weil hier ein einfaches return ausreicht

    open/close ist als veraltet anzusehen, sinnlos umständlich, fehleranfällig.

    Veraltet? Nein, weil die Unterstuetzung fuer Dataisysteme in der Standardbibliothek noch fehlt. Sinnlos? Nein. Umstaendlich? Nein, weil eine Funktion mit 1 bis 2 Parametern. Fehleranfaellig? Nein, weil Funktion mit 1 bis 2 Parametern. ... laeuft auf Errorhandling mittels Returnvalues vs. Exceptions hinaus. Nein Danke!



  • knivil schrieb:

    Mir RAII wäre das sogar trivial.

    Das ist sehr unspezifisch. In C ist es wahrscheinlich auch super trivial.

    volkard schrieb:

    exit ist in C++ eine Todsünde (ehrlich!).

    Ja, weil hier ein einfaches return ausreicht

    Herrje, weil exit keine Destruktoren mehr aufruft, die Ressorchen werden nicht freigegeben, halbangefangene Jobs gammeln rum.

    open/close ist als veraltet anzusehen, sinnlos umständlich, fehleranfällig.

    Veraltet? Nein, weil die Unterstuetzung fuer Dataisysteme in der Standardbibliothek noch fehlt. Sinnlos? Nein. Umstaendlich? Nein, weil eine Funktion mit 1 bis 2 Parametern. Fehleranfaellig? Nein, weil Funktion mit 1 bis 2 Parametern. ... laeuft auf Errorhandling mittels Returnvalues vs. Exceptions hinaus. Nein Danke![/quote]
    [quote]
    Siehe obere Antwort. Mir scheint, Du kennst C++ gar nicht so supi.



  • Herrje, mir scheint so als ob du zuviel ueber Koennen, Erfahrung oder Wissen aus einem Satz ableitest, besonders wenn die Antwort nicht deinen Erwartungen entspricht, oder es mehrere Gruende gibt und nur einer genannt wird, oder ... . Wird return benutzt, so ist main im Vergleich zu anderen Funktionen nichts besonderes mehr. Das war mein Grund fuer diese Antwort. Aber bitte, nimm es als Schild, um nicht veraltet, ueberholt, sinnlos, fehlerhaft und kompliziert zu rechtfertigen.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @knivil
    Wenn du weniger rumnörgeln würdest, dann würden andere Leute vielleicht auch weniger zurücknörgeln?


Anmelden zum Antworten