您可以使用以下功能将文件的内容读取到char数组中:

void readFileContentsIntoCharArray(char* charArray, size_t sizeOfArray) {
    std::ifstream inputFileStream;
    inputFileStream.read(charArray, sizeOfArray);
}

现在,文件以UTF-16LE格式编写,因此我想将文件的内容读取到char16_t数组中,以便以后更轻松地进行处理。我尝试了以下代码。
void readUTF16FileContentsIntoChar16Array(char16_t* char16Array, size_t sizeOfArray) {
    std::ifstream inputFileStream;
    inputFileStream.read(char16Array, sizeOfArray);
}

当然,它没有用。 std::ifstream不接受char16_t。我一直在寻找一种解决方案,但是到目前为止,我找到的唯一相关的解决方案是https://stackoverflow.com/a/10504278/1031769,这没有帮助,因为它使用wchar_t而不是char16_t

如何使其与char16_t一起使用?

最佳答案

您可以将字节读取到char16_t数组中,然后手动转换字节序(不同的体系结构以不同的内存顺序存储宽字符)。

为此,您必须能够检测正在运行的计算机的字节序。

我在此示例中使用了此示例,但您可能希望使用具有可移植编译时间检查的正确库版本:

bool is_little_endian()
{
    char16_t const c = 0x0001;
    return *reinterpret_cast<char const*>(&c);
}

然后,您可以这样做:
std::u16string read_utf16le(std::string const& filename)
{
    // open at end to get size.
    std::ifstream ifs(filename, std::ios::binary|std::ios::ate);

    if(!ifs)
        throw std::runtime_error(std::strerror(errno));

    auto end = ifs.tellg();
    ifs.seekg(0, std::ios::beg);
    auto size = std::size_t(end - ifs.tellg());

    if(size % 2)
        throw std::runtime_error("bad utf16 format (odd number of bytes)");

    std::u16string u16;
    u16.resize(size / 2);

    if(u16.empty())
        throw std::runtime_error("empty file");

    if(!ifs.read((char*)&u16[0], size))
        throw std::runtime_error("error reading file");

    if(!is_little_endian())
    {
        // convert from big endian (swap bytes)
        std::transform(std::begin(u16), std::end(u16), std::begin(u16), [](char16_t c){
            auto p = reinterpret_cast<char*>(&c);
            std::swap(p[0], p[1]);
            return c;
        });
    }

    return u16;
}

09-27 16:12