2013-05-10 263 views
-1

因此,我試圖編寫一個C++程序,將整個文件讀入內存(二進制)。內存塊顯然是個char數組。文件讀取成功,但是當我遍歷值,其中一些是不是字節,像4294967295按字節讀取文件字節,給出了損壞的數據

我真的搜查,嘗試了一切,但沒有任何工程。 值得一提的是,在閱讀文件(這是文本)時,我沒有這個問題。

這裏是代碼:

char* XFile; 
ifstream::pos_type Size; 

bool LoadFile(string FileName) 
{ 
    cout << "Opening File: " << FileName << endl; 
    ifstream FS(FileName.c_str(),ios::in | ios::binary | ios::ate); 

    if (!FS.is_open()) 
     return false; 

    Size = FS.tellg(); 
    cout << "File Size: " << Size << " bytes" << endl; 
    XFile = new char[Size]; 
    FS.seekg(0, ios::beg); 
    FS.read(XFile,Size); 

    for (int i = 0; i < 100; i++) // This loop is to test the read bytes (for example purposes) 
     cout << static_cast<unsigned>(XFile[i]) << "\n"; 

    FS.close(); 

    return true; 
} 
+0

有一件事要提,我使用Ubuntu 13.04和g ++可能是重要的4.7 – 2013-05-10 16:11:35

+0

是什麼'的sizeof(無符號)'我不認爲你得到一個char那裏。 – lcs 2013-05-10 16:14:00

回答

1

的組合:

char* XFile; 

static_cast<unsigned>(XFile[i]) 

將導致XFile[i]首先被轉換爲一個簽名int,然後澆鑄到一個unsigned。因此,如果文件中的值大於127,它將成爲負整數值,然後顯示爲非常大的正值。你可以改變char *unsigned char *並解決問題,或者你可以分兩個階段將其丟:

static_cast<unsigned>(static_cast<unsigned char>(Xfile[i])) 

需要注意的是這個的「數據轉換成不同的表示時」的值被破壞的情況下, ,你的數據實際上是從文件中讀取的,非常好。

0

默認char可以是有符號的或無符號的。在你的平臺上,它顯然是有簽名的,並且static_cast<unsigned>可以將負數轉換爲大的正數。使用unsigned char作爲緩衝區而不是char