Странное преобразование конца строки (CR, LF, CRLF) с istreambuf_iterator <char>(ifstream (..., ios :: binary)) - PullRequest
2 голосов
/ 01 декабря 2011

Я пишу процедуру CRC32 в MSVC ++ 2010, и мне нужно прочитать файл в двоичном режиме, побайтно.

Я делаю это с ifstream и istreambuf_iterator, и это обычно работает, но оно делает некоторые странные вещи с окончаниями строк.

Например, если у меня есть файл с содержанием

LF LF LF CR CR CR

вывод моей программы

 (10) (10) (13) (13) (13) (13)

так что в основном он заменил последний LF на CR. Странный.

Если у меня есть

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 Ответ

1 голос
/ 01 декабря 2011

Это не последний LF с CR отсутствует, это первый LF в файле отсутствует, как вы сделали data++; до std::cout << " (" << int(*data) << ")";

Пробовал сам, и он не отсутствуетчто-нибудь ...

кстати: я использую g ++.

...