C++ / Einlesen von File ist ein anderer Text als in der File selbst

Andi1610

Cadet 3rd Year
Registriert
Juli 2016
Beiträge
62
Hallo Leute,

ich habe ein Problem bei einer Aufgabe (FH) - die ich einfach nicht verstehe.
Das ganze Programm ist schon fertig und läuft, nur bei einem Punkt geht etwas falsch und ich kann es nicht nachvollziehen und würde um eure Hilfe bitten, an was es liegen könnte.

Es muss ein symmetrisches Verschlüssungsprogramm geschrieben werden - das zu verschlüsselnde Wort muss aus einem File eingelesen werden, das Schlüsselwort muss per String über die Konsole eingeben werden, die Ausgabe erfolgt wieder ein File.

Für das entschlüsseln des Textes gilt derselbe Weg.

Jetzt ist aber mein Problem (beim entschlüsseln), dass beim Einlesen des Textes, ein anderer Text reinkommt, als in der File steht.

Mein Insert Text war 4 Buchstaben lang, der Text, der eingelesen wird, ist aber plötzlich 7 Buchstaben lang (das Programm greift auf die richtige Datei zu). Natürlich greift dann die Entschlüsselung nicht mehr richtig (es werden in einer for schleife einfach die Buchstaben "zusammengezählt" bzw. beim entschlüsseln von dem Wort das Schlüsselwort wieder weggerechnet.

Damit es läuft - muss vorher noch ein text.txt erstellt werden mit einem Wunschwort und nach dem verschlüsseln - muss halt dieses in die text.txt kopiert werden - dass das dann wieder entschlüsselt wird.

Liegt es an der Art, wie ich das einlese?

Würde mich sehr freuen, wenn jemand einen Tipp hat - wie gesagt - das ganze Programm ist soweit fertig - nur das Problem zwischen tatsächlichem Text in der File zu dem - was eingelesen wird, versteh ich einfach nicht..

LG Andreas

Code:
#include <iostream>
#include <string>
#include <fstream>
#include <istream>

using std::cout;
using std::cin;
using std::string;
using std::ifstream;
using std::ostream;

bool read_text(string const& text, string& insert);
string encrypt(string& insert, string& key, int& mode, string& output);
string decrypt(string& insert, string& key, int& mode, string& output);
void print(string& output, int& mode);

void main() {

    string insert = "";
    string output = "";
    string key = "";
    int mode = 0;

    read_text("text.txt", insert);

    cout << "Please give me Keyword: ";
    cin >> key;

    cout << "\nMode (Press 1 for encrypt - Press 2 for decrypt): ";
    cin >> mode;

    if (mode == 1) {
        encrypt(insert, key, mode, output);
    }
    if (mode == 2) {
        decrypt(insert, key, mode, output);
    }

    print(output, mode);

}

    string encrypt(string & insert, string & key, int& mode, string&  output) {
        if (mode == 1) {
            int k = 0;
            for (int i = 0;i < insert.size(); ++i) {

                if (k == key.size()) {
                    k = 0;
                }
                output += insert[i] + key[k];
                k = ++k;
            }
            return output;
        }
    }

    string decrypt(string & insert, string & key, int& mode, string& output) {
        if (mode == 2) {
            int k = 0;
            for (int i = 0;i < insert.size(); ++i) {

                if (k == key.size()) {
                    k = 0;
                }
                output += insert[i] - key[k];
                k = ++k;
            }
            return output;
        }
    }

    bool read_text(string const& text, string& insert) {
        ifstream ifs(text);
        insert.clear();
        if (ifs.good()) {
            string text;
            ifs >> text;
            insert = text;
        }
        else {
            return false;
        }
        ifs.close();
        return true;
    }

    void print(string& ouput, int& mode) {
        if (mode == 1) {
            std::ofstream ofs("encrypt.txt");
            ofs << ouput;
            ofs.close();
        }
        if (mode == 2) {
            std::ofstream ofs("decrypt.txt");
            ofs << ouput;
            ofs.close();
        }
        if (mode <= 0 || mode > 2) {
            cout << "\nWrong mode - no printing possible!\n";
        }
    }
 
Code:
output += insert[i] + key[k];
Für den + Operator werden die beiden char implizit in int konvertiert.
1) Ist die Summe größer als der maximale Wert von char?
2) Was macht
Code:
string += int
? Konvertiert es int implizit in char oder in string?

Vielleicht mit expliziten Typkonvertierungen probieren?

Für
Code:
output += insert[i] - key[k];
gilt analoges.
Ergänzung ()

Nebenbei:
Code:
k = ++k;
sieht komisch aus. Warum nicht
Code:
++k;
?


Die eingelesene Datei ist tatsächlich 4 Byte groß? Mit einem Hexeditor überprüft?
 
Zuletzt bearbeitet:
Hallo dvor,

danke für deinen Input, vorweg - das k = ++k ist wirklich nicht schön und werde ich so ändern.

Wo hab ich string += int?

Anbei hab ich 2 Screenshots - einmal - wie der Text im File text.txt aussieht und beim anderen - was vom Lesen des Files in insert reinkommt.

Mein Insert Wort war andi und mein Schlüsselwort susi (zum testen).
Nach dem entschlüsseln sollte wieder andi rauskommen.

Ich würde jetzt nicht glauben, dass ich über das char Limit komme?

MFG Andreas
 

Anhänge

  • Text in File.jpg
    Text in File.jpg
    6,2 KB · Aufrufe: 202
  • Eingelesener Test.jpg
    Eingelesener Test.jpg
    27,3 KB · Aufrufe: 205
Andi1610 schrieb:
Wo hab ich string += int?
Code:
output += insert[i] + key[k];

Das soll an einen String ein Integer (kein char!) anhängen. Habe ich evtl. missverständlich ausgedrückt.

Screenshot 1)
3 der 4 Zeichen sind Sonderzeichen. Je nach Encoding sind das 7 Byte. Von welchem Encoding der Datei geht das Einlesen selbiger aus?
 
Hallo Topinambur,

habe ich schon gemacht - daher weiß ich ja auch - dass das eingelesene nicht mit dem text.txt übereinstimmt.

Aber über den Debugger sehe ich auch nur, dass es reinkommt, aber nicht, warum es so aussieht - wie es aussieht.

MFG Andreas
 
Screenshot 1)
3 der 4 Zeichen sind Sonderzeichen. Je nach Encoding sind das 7 Byte. Von welchem Encoding der Datei geht das Einlesen selbiger aus?

Sorry - da musst du mir jetzt kurz helfen - was du mit dem Encoding meinst.

Das Ziel wäre es, die Buchstaben als ASCII zusammen zuzählen und auszugeben (verschlüsseln).

Wenn es Entschlüsseln will, zieh ich die Werte des Buchstaben des Keywortes wieder ab und sollte den entsprechenden ASCII Wert für den ursprünglichen Buchstaben wieder erhalten.

Ist das zu naiv gedacht?
 
Ok.. für char hab ich ja nur max 128 (127) zur Verfügung.. :(
 
Ich weiß zwar, was du meinst, aber ich kann es dir nicht sagen.

Ich programmiere im VISUAL Studio 2019 - alles auf Standard und ich weiß jetzt auf die schnelle nicht, wo ich das finden würde, welches Encoding Format genutzt wird.
Ergänzung ()

dvor - meinst du das so?
 

Anhänge

  • Hex.JPG
    Hex.JPG
    49,6 KB · Aufrufe: 168
Im Prinzip ja. Aber das ist nicht die einzulesende Datei. Jene nicht im Texteditor öffnen sondern in einem beliebigen Hexeditor.
 
So - das müsste es sein
 

Anhänge

  • Hex_2.JPG
    Hex_2.JPG
    26 KB · Aufrufe: 170
OK. Und jetzt die Datei, die nach dem Kodieren geschrieben und für das Dekodieren gelesen wird.


Was anderes:
Nach encrypt() vor print(): Gib mal den String output und dessen Länge (size) auf den Bildschirm aus.
 
Einmal das dekodierte Ergebnis
Ergänzung ()

Kann es am bool vom read Text eigentlich liegen?
 

Anhänge

  • hex3.jpg
    hex3.jpg
    19,8 KB · Aufrufe: 180
Sehr gut. Damit funktionieren das Kodieren und das Schreiben fehlerfrei. Mein erster Verdacht ist damit falsch.

Wenden wir uns dem Lesen zu.

Andi1610 schrieb:
der Text, der eingelesen wird, ist aber plötzlich 7 Buchstaben lang
Kannst du die 7 "Buchstaben" Hexadezimal anzeigen?
 
du liest doch stets aus der selben Datei
...
read_text("text.txt", insert);
...
geschrieben dahin nichts, zumindest in dem Code dort oben

der Text, der eingelesen wird, ist aber plötzlich 7 Buchstaben lang

bei mir ändert sich nichts, wie sollte auch?
 
  • Gefällt mir
Reaktionen: Xonical
Warum ein in der Datei stehendes D4 zu 50 1F wird kann ich mir beim besten Willen nicht erklären. In UTF-16 sind die beiden Byte ein anderes Zeichen.


Der Operator >> in ifstream hat keine Überladung für Parameter vom Typ String. Der in istream schon.
ifstream ist von istream abgeleitet. Das sollte eigentlich fehlerfrei durchlaufen.


Eine Umgehung des Problems kann sein:
Jedes Byte einzeln lesen, zu char konvertieren und an den String anhängen.
Ergänzung ()

Topinambur schrieb:
du liest doch stets aus der selben Datei
Aber mit unterschiedlichem Inhalt:
Andi1610 schrieb:
Damit es läuft - muss vorher noch ein text.txt erstellt werden mit einem Wunschwort und nach dem verschlüsseln - muss halt dieses in die text.txt kopiert werden - dass das dann wieder entschlüsselt wird.
Ergänzung ()

Noch eine Idee:

Das Kopieren des Verschlüsselten in text.txt hinein erfolgt wie? Windows Editor? Anschließend wird die Datei gespeichert mittles "Speichern"? Versuch mal "Speichern unter" und ganz unten rechts auswählen Codierung: ANSI. Mit UTF-8 geht es schief.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben