来自字符串的eof,而不是流

时间:2013-12-11 16:58:41

标签: c++ string eof

我有一个秘密的“使命”来编写Vigenère密码,用ascii字母表进行分析。

我在加密文字方面遇到了一些麻烦。

它们有两种:

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"
}

在伪代码中(是的,它像狗屎一样:()。

所以,问题是 - 如何将字符串元素与eof进行比较? 也许,我不能谷歌好,但我找不到这个问题的答案。

提前感谢您的每一条建议!


更新: 如果我将逐个字符串加密,它将很容易通过Fridman的方法得到一个密钥的长度(如果密钥非常小)。 所以我想用endl加密文本以获得更高的安全性

1 个答案:

答案 0 :(得分:4)

对于加密,它在很大程度上取决于您要加密的内容, 以及你想用加密文本做什么。通常 解决方案是加密字节值(而不是字符); 这意味着您必须读取和写入加密文件 在二进制模式下,但因为它无论如何都不是可读的, 这通常不是问题。

对于其余部分,字符串没有“EOF”字符。事实上, 没有EOF角色这样的东西[1]。 (Nor endl 事实上,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,则可以替换 std::string::const_iterator auto std::istream::get()。这更简单 键入,但直到你掌握迭代器习语,它可能 最好写出类型,以确保你理解是什么 继续。)

[1]历史上,文本文件中有一些EOF字符 系统。这是您看到的文件末尾 {{1}},但即使在今天,如果你打开一个文件 在Windows下的文本模式下,文件中的0x1A将触发结束 输入中的文件事件。