std :: ifstream一次读取32位

时间:2018-11-21 13:55:52

标签: c++

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

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

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

这是为什么?为什么在使用std :: istreambuf_iterator时一次std :: basic_ifstream无法读取32位。如果这只是要读取char,请执行对char32_t的强制转换,那么模板参数的作用是什么,如何使用std :: istreambuf_iterator一次读取32位文件。

/**
 * @typedef {Object} data
 * @property {Object} user
 * @property {Object} user.list
 * @property {string} user.list.url
 * @property {string} user.list.action
 * @property {string} user.list._type
 */

/**
 *
 * @type {data}
 */
let myJson = EndpointManager.getAPI();
alert(myJson.user.list.url);

1 个答案:

答案 0 :(得分:1)

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

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

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

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