我正在 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));
}
最佳答案
这不是最后一个带有 CR 的 LF 丢失,而是文件中的第一个 LF 丢失,正如您所做的那样 data++;
之前std::cout << " (" << int(*data) << ")";
自己试了一下,没有遗漏任何东西......
顺便说一句:我正在使用 g++。
关于c++ - 使用 istreambuf_iterator<char>(ifstream(..., ios::binary)) 进行奇怪的行结束转换(CR、LF、CRLF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8335349/