2012-02-03 56 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);