2012-04-10 1 views
1

Я пытаюсь написать реализацию rc4. Я читаю в открытом тексте из файла, используя ifstream. Я заметил, что он не выводил в конце файла, поэтому я попробовал различные способы явного очистки буферов. Независимо от того, в каком направлении (используя endl, добавляя \ n, вызывая cout.flush()), я пытаюсь очистить буфер, я получаю segfault. Как проверка работоспособности, я заменил свой код примером из Интернета, который я также тестировал отдельно. Он работает, если я помещаю его в свой собственный файл и компилирую его (например, он печатает содержимое файла, не выполняет segfault и не требует никаких вызовов для flush() или endl, чтобы сделать это), но не в моем коде.Проблемы с промывкой cout после получения файлов данных

Вот обижая бит кода (который прекрасно работает за пределами моего кода, его скопировали в значительной степени непосредственно из cplusplus.com)

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*/ 

Вот полный код: (предупреждение, много закомментирована код)

#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

Возможно, вы вставляете в поток необработанный символ '' \ 0''. Перед тем, как вставить, запустите 'char' в' int' и посмотрите, работает ли это. – ildjarn

+0

Нравится? cout << (int) c; –

+0

Потому что это не помогло ... Я немного растерялся. –

ответ

0

Кроме того, я думаю, что второй вызов is.good() [как и в случае (is.good())], предотвратило бы самый последний символ файла от копирования.

+0

Мне было интересно, почему в этом примере было что-то, неважно, хороший ли файл или нет, поскольку я уже хранил его в c с помощью get()? –

+0

Вызов is.get() может завершиться неудачей, и поэтому они добавили тест is.good(). Однако good() также является ложным после EOF. Таким образом, при нормальной, здоровой операции good() вернет false для последнего символа просто потому, что EOF был достигнут. Было бы лучше заменить второй тест good() на fail(), поскольку EOF не влияет на fail(). – bluedog

+0

Спасибо за объяснение. Это, похоже, не связано с моей проблемой, но, вероятно, это поможет, когда я получу эту бессмыслицу. –

Смежные вопросы