我正在MSVC ++ 2010中编写CRC32例程,需要逐字节读取二进制模式的文件。
我正在使用ifstream
和istreambuf_iterator
进行此操作,它通常可以正常工作,但它会对行结尾做一些奇怪的事情。
例如,如果我有一个包含内容的文件
LF LF LF CR CR CR
我程序的输出是
(10) (10) (13) (13) (13) (13)
所以基本上,它用CR替换了最后一个LF。奇怪。
如果我有
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));
}
答案 0 :(得分:1)
这不是丢失CR的最后一个LF,它是文件中第一个丢失的LF,就像你data++;
之前std::cout << " (" << int(*data) << ")";
自己尝试过它并没有遗漏任何东西......
btw:我正在使用g ++。