我在MSVC++ 2010中編寫一個CRC32例程,需要讀取二進制文件模式,逐字節。奇怪的行結束轉換(CR,LF,CRLF)與istreambuf_iterator <char>(ifstream(...,ios :: binary))
我正在用ifstream
和istreambuf_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));
}
這是如何編譯的?你傳遞了一個臨時的'istreambuf_iterator <>'並將它綁定到一個非const引用... – ildjarn
@ildjarn:對不起,我不明白它有什麼問題。 'istreambuf_iterator'在堆棧中,並且在crc_update運行時不會丟失範圍。爲什麼它應該是'const'?恰當的編譯器給我展示了什麼?無論如何,沒有'&'的結果是一樣的。 –
將臨時綁定到非const引用是非法的。符合的編譯器會在調用crc_update時產生錯誤。按價值傳遞是這裏的正確方法。 – ildjarn