gpt4 book ai didi

c++ - std::ifstream 一次读取 32 位

转载 作者:行者123 更新时间:2023-11-30 04:54:48 28 4
gpt4 key购买 nike

我想知道为什么,对于 stringstream,距离是预期的。迭代器一次迭代超过 32 位,我得到 6。

但是如果 ifstream 在 char32_t 上模板化,我期望它一次读取 4 个字节,但它似乎在 streambuf 内部它将读取一个字符,然后将其转换为 char32_t。所以距离是 24。

文件 test.txt 包含相同的“abcdef”,保存为没有 bom 的 utf32 little endian。可用here

这是为什么?为什么在使用 std::istreambuf_iterator 时 std::basic_ifstream 不能一次读取 32 位。如果这只是要读取一个 char 执行转换为 char32_t,那么模板参数的意义是什么以及我如何使用 std::istreambuf_iterator 一次读取 32 位文件。

#include <iostream>
#include <fstream>
#include <sstream>

int main() {
std::basic_string<char32_t> str = U"abcdef";
std::basic_stringstream<char32_t> data{ str };

//std::basic_ifstream<char32_t> data("test.txt", std::ios::binary);

size_t dist = std::distance(std::istreambuf_iterator<char32_t>(data), std::istreambuf_iterator<char32_t>());

std::cout << dist << std::endl;

return 0;
}

最佳答案

基本上,您的问题归结为两个问题:

  • 字符串流和文件流有什么区别?
  • 为什么 uint32_t 参数化文件流仍然读取单个字节?

这两者都用所谓的编码来解释,在流中由它们的 codecvt(代码转换)方面表示。该方面负责将外部字节转换为内存中的表示形式,反之亦然。默认方面只会将一个内部元素转换为一个外部字节,因此字节和字符之间存在一对一的关系。为了以四个字节为单位读取文件,您需要使用 UCS4 或 UTF-32 代码转换方面imbue() 流。

对于字符串流,您不指定外部序列而是指定内部序列,因此不会发生代码转换。

关于c++ - std::ifstream 一次读取 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53413661/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com