2013-12-11 38 views
0

我有一個祕密的「任務」,寫Vigenère密碼與ascii字母分析。eof字符串,而不是流

我對加密文本有些麻煩。

有兩種人:

1)如果我使用全ASCII表,也有一些麻煩與解密的文字,因爲我用的是殺死我的文字(順便說一下「系統」字符,它是「戰爭與和平」由托爾斯泰撰寫)。我應該使用截斷版本嗎? 如果是的話,那麼 - 我可以使用截斷的ascii表執行下一個問題的操作嗎?

2)我想在一個字符串中包含整個我的文本。我可以這樣做:

string s; 
string p = ""; 
ifstream in("text_for_encryption.txt"); 
while (getline(in, s)) 
{ 
p+=s; 
p+="\n"; 
} 

「S」是臨時字符串,而「P」是具有從文件中的所有文本(與ENDL的,當然,EOF)字符串 我會作出「p」,它看起來像作爲

while (not eof in p) 
{ 
    take first keyword.length() chars from "p"? check every of them for EOF and encrypt them. (they will be deleted from p) 
    kick them in file "encrypted_text.txt" 
} 

僞代碼(是的,這是狗屎般的:()週期

所以,問題是 - 我怎麼能比較字符串元素也許,我不能谷歌好,但我找不到這個問題的答案。

在此先感謝您的每一個建議!


更新: 如果我將加密字符串的字符串,其無線本地環路可以輕鬆搞定由弗裏德曼的方法的一個關鍵的長度(如果該鍵是相當小)。 ,所以我想爲更多的安全

+0

爲什麼不按照你的要求加密每一行? – jrok

+0

爲什麼要檢查EOF?只需加密整個字符串,就知道它的長度。 –

回答

4

加密與ENDL的文本加密,它在很大程度上取決於你要加密, 和你想加密的文本做什麼。通常的 解決方案是加密字節值(不是字符); 這意味着你將不得不以二進制模式讀取和寫入加密文件 ,但由於它不能被讀取,所以通常不是問題。

其餘的字符串沒有「EOF」字符。實際上, 沒有EOF字符[1]。 (也不是。)EOF實際上是從流中讀取時發生的「事件」 ;在C++中,它實際上被視爲 一種錯誤。 std::istream函數可以返回 EOF(例如std::istream::get())返回int,而不是char, 以便能夠返回帶外值。

字符串確實已知長度。要訪問所有的字符 中的字符串:

for (std::string::const_iterator current = s.begin(); 
     current != s.end(); 
     ++ current) { 
    // Do something with *current... 
} 

(如果你有C++ 11,你可以用auto替代 std::string::const_iterator。這是簡單得多 打字,但直到你掌握了迭代成語,它可能 更好地寫出類型出來,以確保您瞭解什麼是 回事。)

[1]從歷史上看,文本文件有某些 系統上的EOF字符。這是您使用 std::istream::get()看到文件,但即使在今天結束,如果你在Windows下 文本模式下打開一個文件,一個0x1A的文件中會觸發輸入文件事件的結束 。

+0

好的,非常感謝你! –

相關問題