2011-12-01 71 views
2

我在MSVC++ 2010中編寫一個CRC32例程,需要讀取二進制文件模式,逐字節。奇怪的行結束轉換(CR,LF,CRLF)與istreambuf_iterator <char>(ifstream(...,ios :: binary))

我正在用ifstreamistreambuf_iterator這樣做,它通常工作,但它行結尾有一些奇怪的事情。

舉例來說,如果我有一個文件,內容

LF LF LF CR CR CR 

我的程序的輸出是

(10) (10) (13) (13) (13) (13) 

所以基本上,它取代了最後的LF帶CR。奇怪。

如果我有

CR CR LF CR 

(13) (10) (13) (13) 

所以交換了CRLF!當文件中還有更多內容時,它也會交換它們。

有什麼解決方法嗎?我想堅持C++爲此,我實際上想要讀取二進制文件,而無需解釋任何行結束(我認爲只有istream_iterator會這樣做)!


只是爲了保持完整性,測試代碼,我是這樣的,改編自pyCRC

static inline crc_t crc_update(crc_t       crc, 
           std::istreambuf_iterator<char> data, 
           long long      data_len) 
{ 
    unsigned int tbl_idx; 
    while (data_len--) 
    { 
     tbl_idx = (crc^*data) & 0xff; 
     crc = (crc_table[tbl_idx]^(crc >> 8)) & 0xffffffff; 

     data++; 

     std::cout << " (" << int(*data) << ")"; 
    } 
    return crc & 0xffffffff; 
} 

int main(int argc, char* argv[]) 
{ 
    std::ifstream file(argv[1], std::ios::in | std::ios::binary); 
    struct _stati64 filestats; 
    errno_t stat_error = _stati64(argv[1], &filestats); 
    if (stat_error != 0) 
     return errno; 
    std::cout << crc_finalize(
         crc_update(crc_init(), 
           std::istreambuf_iterator<char>(file), 
           filestats.st_size)); 
} 
+1

這是如何編譯的?你傳遞了一個臨時的'istreambuf_iterator <>'並將它綁定到一個非const引用... – ildjarn

+0

@ildjarn:對不起,我不明白它有什麼問題。 'istreambuf_iterator'在堆棧中,並且在crc_update運行時不會丟失範圍。爲什麼它應該是'const'?恰當的編譯器給我展示了什麼?無論如何,沒有'&'的結果是一樣的。 –

+0

將臨時綁定到非const引用是非法的。符合的編譯器會在調用crc_update時產生錯誤。按價值傳遞是這裏的正確方法。 – ildjarn

回答

1

它不與CR最後的LF缺失,這是文件中的第一個LF是缺少,因爲你std::cout << " (" << int(*data) << ")";

以前那樣data++;嘗試過自己和BTW它沒有缺少什麼?

:我使用的是G ++。

+0

LOL ...男人我覺得很愚蠢,這是晚上編程的價格:( –