gpt4 book ai didi

c++ - 使用 istreambuf_iterator(ifstream(..., ios::binary)) 进行奇怪的行结束转换(CR、LF、CRLF)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:51 27 4
gpt4 key购买 nike

我正在 MSVC++2010 中编写 CRC32 例程,需要以二进制模式逐字节读取文件。

我用 ifstreamistreambuf_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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com