如何在C ++中将文件的内容读取到char16_t数组中?

时间:2018-09-08 03:04:57

标签: c++

您可以使用以下函数将文件的内容读取到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而不是{{1} }。

如何使其与char16_t一起使用?

2 个答案:

答案 0 :(得分:0)

我已经创建了一个示例UTF-16LE文件,并且此代码能够正确读取它。您可以尝试一下:

std::string readUTF16(const char* filename) {
    std::wifstream file(filename, std::ios::binary);
    file.imbue(std::locale(file.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));

    std::wstring ws;
    for(wchar_t c; file.get(c); ) {
        ws += (char16_t) c;
    }
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
    return converter.to_bytes(ws);
}

答案 1 :(得分:0)

您可以将字节读取到 RuntimeService runtimeService; ProcessEngine activitiProcessEngine TaskService taskService = processEngine.getTaskService(); runtimeService = activitiProcessEngine.getRuntimeService(); taskService = activitiProcessEngine.getTaskService(); Map<String, Object> vars =taskService.createTaskQuery(). processInstanceId(pi.getId()).taskDefinitionKey("taskTest") .singleResult().getProcessVariables(); 数组中,然后手动转换字节序(不同的体系结构以不同的内存顺序存储宽字符)。

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

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

char16_t

然后您可以执行以下操作:

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