Изменить порядок байтов при чтении из файла - PullRequest
0 голосов
/ 25 декабря 2018

Я пытаюсь лучше понять порядок байтов, когда кто-то читает файл.

Я использую машину с прямым порядком байтов.

Предполагается, что приведенный ниже код предназначен для чтения файлов любого типа.

Но что, если файл, который мы читаем, находится в кодировке UTF-16BE, должны ли мы после прочтения всего файла изменить порядковый номер?

Я спрашиваю это, потому что планирую редактироватьсодержимое файла и вывод его в консоль.

В случае, если мы должны изменить порядок байтов, как это можно сделать?

Сейчас я читаю такие файлы:

std::ifstream file("/RANDOME/PATH/file.html", std::ios::in | std::ios::binary);

std::string result;

file.seekg(0, std::ios::end);   
result.reserve(t.tellg());
file.seekg(0, std::ios::beg);


result.assign((std::istreambuf_iterator<char>(file)),
            std::istreambuf_iterator<char>());


file.close();

Понятия не имеюкак изменить порядковый номер с большим на маленький при чтении файла.Может кто-нибудь, пожалуйста, покажите мне шаг за шагом, как это делается правильно?Я только пытаюсь учиться.Я знаю, что файл использует кодировку UTF-16BE, что не является догадкой.

1 Ответ

0 голосов
/ 30 декабря 2018

Вот код, который делает то, что вы хотите.Обратите внимание, что этот код читает входной файл построчно, а не читает все одним махом.

#include <string>
#include <fstream>

void swap_bytes (char16_t *s)
{
    while (*s)
    {
        unsigned char *uc = (unsigned char *) s;
        unsigned char swap = *uc;
        *uc = uc [1];
        uc [1] = swap;
        ++s;
    }
}

int main ()
{
    std::basic_ifstream <char16_t> file ("/RANDOME/PATH/file.html", std::ios::in);
    if (!file)
        return 1;

    std::basic_string <char16_t> line;

    while (std::getline (file, line))
    {
        swap_bytes (line.data ());
        // ...
    }

    file.close();
}

Если что-то неясно, скажите это в комментариях.

Live демо

...