Zu frühe eof-Meldung unter C++

lBr1anl

New member
Hi,
nachdem das if-Problem erfolgreich erledigt wurde (ich schäme mich immer noch dafür :D ) gibt's nun ein zweites Problem mit meinem Programm. Und zwar funktioniert es noch relativ gut, solange ich nur einfache .txt-Dateien verschlüsseln will. Sobald ich mich allerdings an eine .mp3 oder sonstwas wage, bekomme ich als verschlüsselte Datei nur ein ca. 2,nochwas KB großes File. Woran kann das liegen, bzw. wie kann ich das verhindern?

Hier noch der Quellcode:
Code:
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

char zeichen_verschluesseln(char klar, char schluessel)
{
     char code;                                        //Schonmal die Variable für den verschlüsselten Char bereitmachen
     int schluessel_ascii = (int)schluessel;           //ASCII-Wert des Schlüssels in schluessel_ascii speichern
     int ascii = (int)klar;                            //ASCII-Wert des Klar-Zeichens in ascii speichern
     ascii = ascii + schluessel_ascii;                        //ASCII-Wert des Schlüssels und des Klar-Zeichens addieren
     //if(ascii>127)ascii=ascii-128;                     //Wenn ASCII-Wert out of range, dann von vorne anfangen
     code = (char)ascii;                               //Fertigen ASCII-Wert wieder auf char casten
     return code;                                      //Und den ganzen Senf zurückgeben
}

char zeichen_entschluesseln(char code, char schluessel)
{
     char klar;                             
     int schluessel_ascii = (int)schluessel;
     int ascii = (int)code;
     ascii = ascii - schluessel_ascii;                         //Das gleiche wie bei zeichen_verschluesseln, nur halt andersrum
     //if(ascii<0)ascii=ascii+128;                        //(ASCII-Wert des Schlüssels vom Code-Zeichen abziehen)
     klar = (char)ascii;
     return klar;
}

int main()
{
    char datei_klar[99];                                //Char-Array für den Dateinamen der zu verschlüsselnden Datei
    char datei_code[99];                                //Char-Array für den Dateinamen der zu entschlüsselnden Datei
    char nachricht_klar;                                //char für den jeweils zu verschlüsselnden Buchstaben
    char nachricht_code;                                //char für den jeweils zu entschlüsselnden Buchstaben
    int auswahl;                                        //int für die Anfangsauswahl
    int schluessel_laenge;                              //Länge des Schlüssels, man muss ja auch wissen, wann man aufhören muss
    int schluessel_stelle;                              //Wo bin ich gerade im Schlüssel?
    string schluessel;                                  //The key himself
    
    schluessel_stelle =   0;                            //Fangen wir mal bei 0 an
    
    cout<<"***********************************"<<endl;
    cout<<"*****Vigenere-Verschluesselung*****"<<endl;
    cout<<"***********************************"<<endl<<endl;
    cout<<"Bitte waehlen Sie, ob Sie ver- oder entschluesseln wollen"<<endl;
    cout<<"(1) Verschluesseln"<<endl;
    cout<<"(2) Entschluesseln"<<endl;                   //Menü-bla
    cin>>auswahl;                                       //Auswahl eingeben
    
    if(auswahl==1)                                      //Verschlüsseln-zweig
    {
                  cout<<"Bitte den Namen der zu verschluesselnden Datei eingeben (mit Dateiendung)"<<endl;
                  cin>>datei_klar;
                  
                  cout<<"Bitte den Schluessel eingeben (beliebige Zeichenfolge)"<<endl;
                  cin>>schluessel;
                  
                  cout<<"Bitte den Namen der verschluesselten Datei angeben"<<endl;
                  cin>>datei_code;
                  
                  schluessel_laenge=schluessel.length();      //Länge des Schlüssels herausfinden
                  
                  ifstream klar(datei_klar);                  //Zu verschlüsselnde Datei öffnen
                  
                  ofstream code(datei_code);                  //Datei für den Code-Text öffnen
                  
                  while(!klar.eof())                          //bis zum bitteren Ende...
                  {
                          nachricht_klar=klar.get();          //Hol dir das nächste Zeichen aus der Datei
                          
                          if(klar.eof())break;
                          
                          nachricht_code=zeichen_verschluesseln(nachricht_klar,schluessel[schluessel_stelle]);
                          //Verschlüssele es mit dem jeweils aktuellen Schlüsselzeichen
                          code<<nachricht_code;
                          //und speichere es in der geöffneten Datei
                          schluessel_stelle++;
                          //Nimm dir die nächste Schlüssel-stelle
                          
                          if(schluessel_stelle>(schluessel_laenge-1))schluessel_stelle=0;
                          //Und wenn du am Ende bist, fang' wieder von vorne an :)
                  }        
    }
    if(auswahl==2)                                      //Entschlüsseln-zweig
    {
                  cout<<"Bitte den Namen der zu entschluesselnden Datei eingeben (mit Dateiendung)"<<endl;
                  cin>>datei_code;
                  
                  cout<<"Bitte den Schluessel eingeben (beliebige Zeichenfolge)"<<endl;
                  cin>>schluessel;
                  
                  cout<<"Bitte den Namen der entschluesselten Datei angeben"<<endl;
                  cin>>datei_klar;
                  
                  schluessel_laenge=schluessel.length();
                  
                  ifstream code(datei_code);
                  
                  ofstream klar(datei_klar);
                  
                  while(!code.eof())
                  {
                          nachricht_code=code.get();
                          
                          if(code.eof())break;
                                    
                          nachricht_klar=zeichen_entschluesseln(nachricht_code,schluessel[schluessel_stelle]);
                          //dasselbe wie oben, nur dass hier ent- und nicht verschlüsselt wird
                          klar<<nachricht_klar;
                          
                          schluessel_stelle++;            
                          
                          if(schluessel_stelle>(schluessel_laenge-1))schluessel_stelle=0;
                  }
    }
}
Edit: Ich hab' das ganze jetzt mal (hoffentlich) gescheit kommentiert.
 
Oben