2016-01-28 28 views
0

我有這樣的代碼使用十六進制保存輸出增加了空格?

int main() 
{ 
ifstream fin; 
ofstream fout; 

string filename = "X64-MK10Game.ini"; 

fin.open(filename.c_str(),ios::binary); 
fin>>noskipws; 
fout.open("MODDED.ini"); 

unsigned char x; 

while(fin>>x) 
{ 
    fout<<x; 
} 

return 0; 
} 

這段代碼的事情是,該文件是這樣的:

[MAIN] 
Options 

我得到的輸出是

[MAIN] 

Options 

人幫助我呢?

+0

哪個平臺?輸入文件和輸出文件的精確*內容是什麼(根據ASCII值)?我敢打賭,輸出包含序列「0x0D 0x0D 0x0A」。 – Angew

+0

@Angew它確實包含0x20 0x0D 0x0A。 Windows - 使用CODE :: BLOCKS。根據ASCII碼的內容是在上面的問題中顯示的內容。 – user3025371

+0

是的。你需要以二進制模式打開'fout'。 –

回答

0

問題是您正在以二進制模式閱讀fin,但在文本模式下書寫fout

在二進制模式下,不會重新解釋行尾字符。在Windows上的文本模式下,讀取對\r\n僅返回字符\n,並且寫入字符\n會導致\r\n寫入輸出流。

因此,由於fin以二進制打開,因此您將獲得字符\r\n。由於fout以文本方式打開,因此在其中寫入\r會生成\r,然後將\n寫入它會生成\r\n,複製回車符。

解決方法是以二進制模式打開fout。而且由於您顯然對二進制I/O感興趣,因此您可能需要使用非透明I/O功能read()write()而不是>><<操縱器,這些操縱器旨在用於格式化的 I/O。

+0

你可以請你解釋一下read()和write()嗎?我的意思是他們處理字節值?因爲我實際上是以十六進制讀取值,然後將它們轉換爲文本,修改它們,然後將它們轉換回十六進制並存儲,這是一個痛苦。編輯:NVM我發現它(y) – user3025371