奇怪的行结束转换(CR,LF,CRLF)与istreambuf_iterator <char>(ifstream(...,ios :: binary))</char>

时间:2011-12-01 01:08:03

标签: c++ visual-c++ binary-data ifstream line-endings

我正在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));
}

1 个答案:

答案 0 :(得分:1)

这不是丢失CR的最后一个LF,它是文件中第一个丢失的LF,就像你data++;之前std::cout << " (" << int(*data) << ")";

一样

自己尝试过它并没有遗漏任何东西......

btw:我正在使用g ++。