eof来自字符串,而不是流

eof from string, not a stream

本文关键字:字符串 eof      更新时间:2023-10-16

我有一个秘密的"任务",用ascii字母表分析Vigenère密码。

我在加密文本时遇到了一些麻烦。

它们有两种:

1) 如果我使用整个ascii表,解密文本会有一些麻烦,因为我使用的"系统"字符会杀死我的文本(顺便说一句,这是托尔斯泰写的《战争与和平》)。我应该使用它的截断版本吗?若是,那个么——我可以用截断的ascii表做下一个问题的运算吗?

2) 我想把我的全部文本放在一个字符串中。我可以这样做:

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

"s"是临时字符串,"p"是包含文件中所有文本的字符串(当然还有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加密文本以提高的安全性

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

对于其余部分,字符串没有"EOF"字符。事实上不存在EOF字符[1]。(也不适用于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,你可以替换CCD_ 6与CCD_。这要简单得多键入,但在掌握迭代器习惯用法之前最好写出类型,以确保您了解正在进行。)

[1] 从历史上看,文本文件在某些系统。这是而不是您看到的文件结尾std::istream::get(),但即使在今天,如果您在在Windows下的文本模式下,文件中的0x1A将触发结束的事件。