读/写文件,字节丢失,可能是char溢出

时间:2012-02-03 17:26:52

标签: c++ encryption vector char overflow

我是编程新手,有时甚至我写的东西对我来说都是神秘的。这是我第一次在互联网上寻求帮助。

我在这里有一个问题,我现在已经有一段时间没办法解决了。

这就是我想要做的事情:
从文件中逐字节读取到向量中,修改字节并将其写回。

这是发生的事情:
所有的加密东西似乎都有效,但不知何故,在这些操作中的一些操作之后,文件的一部分会丢失。

在字节修改过程中,我使用char溢出,这意味着我在向量的每个部分添加一些随机数并将其整体写回。

在我看来,这可能是我不知道的某种算术溢出问题。

顺便说一句,我使用Qt SDK和Windows环境,以防万一。

这是代码片段:

void crypt(string * password,string filename, int sign){
    vector<char> stack;
    ifstream is;
    is.open(filename.c_str());
    char c;
    for (int i = 0; !is.eof(); i++){
        is >> noskipws >> c;
        stack.push_back(c);
    }
    stack.pop_back();
    is.close();
    int code = 0;
    double x;
    char method = 0;
    int var;
    for (int i = 0; i < password->size(); i++)
        code += password->at(i);
    for (int i = 0; i < (stack.size()); i++){
        // some unrelated stuff skipped
        if (sign == 1)code += stack[i];
        stack[i] += var*method*sign;    //<----this might be the cause!
        if (sign == -1)code += stack[i];
        method = 0;
    }
    ofstream os;
    os.open(filename.c_str());
    for (int i = 0; i < stack.size(); i++){
        os << noskipws << stack[i];
    }
    os.flush();
    os.close();
}

对于代码中的混乱,我有点把它写进来进行测试。

任何想法都将受到赞赏。

1 个答案:

答案 0 :(得分:3)

您正在以“文本”模式打开文件,这可能会导致问题,尤其是因为您的输出字符肯定会超出可打印的ASCII字符范围。这可能导致窗口问题,例如,当您尝试输出值0xD(回车)时,库会将其转换为0xD,然后是0XA(换行)。

因此,尝试以二进制模式打开文件,如下所示:

os.open(filename.c_str(), ios::binary);