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

标签 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));
}

最佳答案

这不是最后一个带有 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/

相关文章:

C++:静态函数的模板?

c++ - MSVC++ 编译器错误 C2143

visual-studio - 对 Visual Studio C++ 项目使用/Zi vs/Z7 有什么影响?

javascript - 使用 jquery AJAX PDF 下载

binary-data - 二进制 float 减法

c++ - 使用优先级队列时出现段错误

c++ - 如何在 Visual Studio 中使用有关 header 路径的 C++ 库的依赖项

php - 如何在 php 中显示来自 curl 的二进制数据

c++ - 使用自定义 std::set 比较器

dll - 是否有与 gcc --kill-at 等效的 Visual C++?