std::ifstream一次读取32位



我想知道为什么,对于字符串流,距离是预期的。迭代器一次迭代32位,得到6位。

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

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

为什么会这样?为什么在使用std::istreambuf_titerator时,std::basic_ifstream不能一次读取32位。如果这只是要读取一个字符,执行对char32_t的强制转换,那么模板参数的意义是什么,以及如何使用std::istreambuf_editor一次读取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()流。

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

相关内容

最新更新