2012-02-03 21 views
2

我是编程新手,有时甚至我写的东西对我来说仍然很神秘。这是我第一次在互联网上寻求帮助。读取/写入文件,字节丢失,字符溢出可能是字符溢出

我在这里有一个问题,我现在还没有能够解决它一段时间。

这就是我想做的事:
按字节读取字节从文件到一个载体,修改字节并将其写回。

这是发生了什么:
所有加密的东西似乎工作,但不知何故,几经这些操作的文件的一部分去错过的。

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

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

顺便说一句,我使用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(); 
} 

对不起,在代码中的混乱,我有点写测试。

任何想法将不胜感激。

回答

3

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

所以,尽量以二进制方式来打开你的文件是这样的:

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