关于文件成员函数get的问题


#include<iostream>
#include<string>
#include<fstream>

using namespace std;
int main(void)
{
    string dest, sr;
    int pass;

    cout << "需加密或解密的文件位置" << endl;
    cin >> dest;
    cout << "文件存放位置" << endl;
    cin >> sr;

    cout << "请输入你要设定的密钥或者原始密钥" << endl;
    cin >> pass;

    ifstream p(dest, ios::in | ios::binary);
    ofstream p1(sr, ios::out | ios::binary);
    if (p.is_open())
    {
        char ch;
        while (p.get(ch))
        {
            ch ^= pass;
            p1 << ch;
            //p1.put(ch);
        }
    }
    else
    {
        cout << "no file" << endl;
    }

    cout << "完成" << endl;
    return 0;
}

上面是个异或加密,我用来加密图片和文字(png,jpg,txt),在写的过程中我发现个很有趣的问题,就是将while循环的那句 p.get( ch ) 换成 ( ch = p.get( ) ) != EOF 之后解码出来的结果就是乱码或解析不出来,同时加密的文件大小变成源大小的五分之一,但p.get()应该不会返回超过127的数字,我查询了很久也没头绪,如果有知道的请不吝赐教

【以下回答由 GPT 生成】

问题分析:

问题中的代码片段使用了ifstream的get函数来读取文件的每个字符,并使用异或操作进行加密。然后使用ofstream的<<运算符将加密后的字符写入到新文件中。

问题中提到,当将代码中的while循环内的代码p.get(ch)修改为(ch = p.get()) != EOF后,解码出来的结果变成了乱码或无法解析,并且加密后的文件大小变为源文件大小的五分之一。

原因分析:

造成这种情况的可能是因为(ch = p.get()) != EOF会将文件的每个字节都读取,包括文件中的EOF字符(-1)。而在C++中,EOF是一个特殊的值(-1),它不能通过异或操作进行正确的解码。

解决方案:

  1. 将代码中的 (ch = p.get()) != EOF 修改回 p.get(ch),使用get函数逐个读取字符。

  2. 考虑更好的加密算法。在上述代码中,只是对文件的每个字符进行了简单的异或操作,并没有实际的加密效果。可以选择更强大的加密算法,如AES、RSA等。

代码示例:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(void)
{
    string dest, sr;
    int pass;

    cout << "请输入需要加密或解密的文件位置:" << endl;
    cin >> dest;
    cout << "请输入文件存放位置:" << endl;
    cin >> sr;

    cout << "请输入要设定的密钥或者原始密钥:" << endl;
    cin >> pass;

    ifstream p(dest, ios::in | ios::binary);
    ofstream p1(sr, ios::out | ios::binary);

    if (p.is_open())
    {
        char ch;
        while (p.get(ch))
        {
            ch ^= pass;
            p1 << ch;
        }
    }
    else
    {
        cout << "找不到文件" << endl;
    }

    cout << "完成" << endl;
    return 0;
}

解决方案已经给出并提供了代码示例,如果还有其他问题请及时提出。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

p.get(ch)
这个可能会跳过非ascii字符