Sum charrs和subtract to get file

时间:2017-07-10 08:58:59

标签: 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(已编辑)*********

chars数组声明:

int num[9999]

int buf[9999]

int rdn[9999]

1 个答案:

答案 0 :(得分:2)

GetRandom_Soft()返回char,其值范围为[-128; 127],并尝试分配范围[0; 255] - 不能正常工作。

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

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

在这里:

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

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

修改

更新后几乎肯定是unsigned char溢出的问题。 unsigned char从范围[0; 255]获取值 - 如果您添加的结果是&gt; 255或减法的结果是&lt; 0,比你得到错误的结果。似乎将值解释为int在您的数字的情况下更有意义。