c++ - 对字符求和并减去得到文件

标签 c++ char fopen

我正在编写一个程序,用一个随机数对文件中的一个字符求和,然后再减去该文件。

问题是当我对它们求和并相减时,生成的文件不一样。

可能是我的数学不好或者我对字符不了解。

求和代码(已编辑):

while (!feof(filename))
{
    size_t read = fread(&buf, sizeof(char), max_array, filename);
    for (unsigned long long i = 0; i < read; i++)
    {
        unsigned char rdn = GetRandom_Soft();
        /*
        if (buf[i] + rdn > 255) buf[i] = (buf[i] + rdn) - 255;
        else buf[i] = buf[i] + rdn;
        */
        buf[i] = buf[i] + rdn;
        num[i] = rdn;
    }
    fwrite(&num, sizeof(char), read, filename_n);
    fwrite(&buf, sizeof(char), read, filename2);
}

代码 GetRandom()(已编辑):

int GetRandom_Soft()
{
    return rand() % 256;
}

要减去的代码(已编辑):

while (!feof(filename2))
{
    size_t read_c = fread(&num, sizeof(char), max_array, filename_n);
    fread(&buf, sizeof(char), max_array, filename2);
    for (unsigned long long i = 0; i < read_c; i++)
    {
        buf[i] = buf[i] - num[i];
        /*
        if(buf[i] - num[i] < 0) buf[i] = (buf[i] - num[i]) +255;
        else buf[i] = buf[i] - num[i];
        */
    }
    fwrite(&buf, sizeof(char), read_c, filename);
}

*********更新 1*********

filename = 指向原始文件的文件指针

filename_n = 指向带有编号的文件的文件指针

filename2 = 指向文件的文件指针,包含 filenamefilename_n

*********更新 2(已编辑)*********

字符数组声明:

整数[9999]

int buf[9999]

int rdn[9999]

最佳答案

GetRandom_Soft() 返回 char,其取值范围为 [-128;127],您尝试从 [0 ; 127] 范围内分配值。 255] - 无法正常工作。

我也怀疑你在这里做类似的事情:

buf[i] = buf[i] + rdn;

这里:

buf[i] = buf[i] - num[i];

我怀疑 bufnum 或两者的类型与 char* 不同(例如 unsigned char*) AND/OR 加法或减法的结果超出 char 值范围,这会破坏结果。

编辑

更新后,几乎可以肯定是 unsigned char 溢出的问题。 unsigned char 取值范围 [0;255] - 如果加法结果 > 255 或减法结果 < 0,那么你将得到错误的结果。对于您的数字,将值解释为 int 似乎更有意义。

关于c++ - 对字符求和并减去得到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007750/

相关文章:

c# - 将字符转换为键

c++ - fopen() 失败

c++ - 将UTC时差转换成字符串boost

c++ - 为什么在使用 libc++ 时 sizeof( std::variant< char > ) == 8 而不是 2 (如 MSVC 的 STL 和 libstdc++)?

c - 在c中使用char数组的总线错误

c++ - 为什么指针指向零值时是空白的?

C 命名文件的日期

c - 读取子目录中的文件

c++ - 关于 C++ 异常。函数()抛出()

c++ - 边界框视锥体剔除的问题