首页 > 解决方案 > 从文件读取时更改字节顺序

问题描述

当有人阅读文件时,我试图更好地理解字节顺序。

我使用的机器是小端的。

下面的代码应该可以读取任何文件类型。

但是如果我们正在读取的文件是 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 编码。

标签: c++endianness

解决方案


这是一些可以执行您想要的代码。请注意,此代码一次读取输入文件一行,而不是一口气读取所有文件。

#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();
}

如果有任何不清楚的地方,请在评论中说出来。

现场演示


推荐阅读