2012-04-10 10 views
1

Ich versuche, eine Implementierung von RC4 zu schreiben. Ich lese im Klartext aus einer Datei mit einem ifstream. Ich bemerkte, dass es am Ende der Datei nicht ausgegeben wurde, also versuchte ich die verschiedenen Möglichkeiten, die Puffer explizit zu löschen. Egal, auf welche Weise (mit einem endl, anhängendes \ n, cout.flush() aufrufen) Ich versuche, den Puffer zu löschen, ich bekomme einen segfault. Als Plausibilitätsprüfung habe ich meinen Code durch ein Beispiel aus dem Internet ersetzt, das ich auch separat getestet habe. Es funktioniert, wenn ich es in eine eigene Datei lege und kompiliere (z. B. druckt es den Inhalt der Datei aus, segfault nicht und benötigt keine Aufrufe von flush() oder endl), aber nicht in meinem Code. HierProbleme mit Spülung cout nach dem Abrufen von Daten

ist das säumige Stück Code (was in Ordnung außerhalb meines Codes arbeitet, seine so ziemlich direkt von cplusplus.com kopiert)

ifstream is; 
is.open("plain"); 
char c; 
while (is.good())  // loop while extraction from file is possible 
{ 
    c = is.get();  // get character from file 
    if (is.good()) 
     cout << c; 
//  cout.flush(); 
} 
is.close();   // close file*/ 

Hier ist der vollständige Code: (Warnung, viele kommentierten out Code)

#include <iostream> 
#include <fstream> 
#include <string.h> 
#include <vector> 

using namespace std; 
static char s[256], k[256]; 
//static char *i, *j; 
void swap(int m, int n, char t[256]){ 
     char tmp = t[m]; 
     t[m] = t[n]; 
     t[n] = tmp; 
} 

char getByte(){ 
     static char i(0), j(0); 
     i = (i+1)%256; 
     j = (j + s[i])%256; 
     swap(i, j, s); 
     return s[(s[i]+s[j]) % 256]; 
} 

int main(int argc, char ** argv){ 
     /*string key = argv[1];*/ 
     if(argc < 4){ 
       cout << "Usage: \n rc4 keyfile plaintextfile outputfile" << endl; 
       return -1; 
     } 
     string key; 
     ifstream keyfile (argv[1]); 
     keyfile >> k; 
     cout << "Key = " << k << endl; 
     keyfile.close(); 
     /*ifstream plaintextf; 
     plaintextf.open(argv[2]);*/ 

     ofstream ciphertextf (argv[3]); 

     for(int q = 0; q < 256; q++){ 
       s[q] = q; 
     } 
     int i, j; 
     for(int m = 0; m < 256; m++){ 
       j = (j + s[m] + k[m % sizeof(k)])%256; 
       swap(m, j, s); 
     } 
//  vector<char> bytes(plaintext.begin(), plaintext.end()); 
//  bytes.push_back('\0'); 
//  vector<char>::iterator it = bytes.begin(); 
/*  char pt; 
     while(plaintextf.good()){ 
       pt = plaintextf.get(); 
       if(plaintextf.good()){ 
         cout << pt; 

         ciphertextf <<(char) (pt^getByte()); 
       } 

     } */ 
     ifstream is; 
     is.open("plain"); 
     char c; 
     while (is.good())  // loop while extraction from file is possible 
     { 
      c = is.get();  // get character from file 
      if (is.good()) 
       cout << c; 
//    cout.flush(); 
     } 
    is.close();   // close file*/ 

/*// plaintextf.close(); 
     ciphertextf.close(); 
     keyfile.close(); 
     */ 
     return 0; 
} 
+0

Sie fügen wahrscheinlich ein rohe '\ 0''-Zeichen in den Stream ein. Wirf das 'char' vor dem Einfügen in ein' int' und sieh nach, ob das funktioniert. – ildjarn

+0

Gefällt mir? cout << (int) c; –

+0

Weil das nicht geholfen hat ... Ich bin hier ziemlich ratlos. –

Antwort

0

Außerdem denke ich, den zweiten Anruf is.good() [wie in if (is.good())], würde das letzte Zeichen der Datei nicht kopiert verhindern.

+0

Ich fragte mich, warum das Beispiel das hatte - wäre es nicht egal, ob die Datei gut ist oder nicht, wie ich sie bereits in c mit get() gespeichert hatte? –

+0

Der Aufruf von is.get() konnte fehlschlagen und deshalb wurde der Test is.good() hinzugefügt. Allerdings ist auch gut() nach EOF falsch. In der normalen, gesunden Operation würde also good() für das letzte Zeichen false zurückgeben, einfach weil EOF erreicht wurde. Es wäre wahrscheinlich am besten, den zweiten Test good() durch fail() zu ersetzen, da fail() nicht von EOF beeinflusst wird. – bluedog

+0

Danke für die Erklärung. Das scheint nicht mit meinem Problem zu tun zu haben, aber es wird wahrscheinlich helfen, sobald ich diesen Stream Nonsens herausgefunden habe. –

Verwandte Themen