【问题标题】:How to use something like `std::basic_istream<std::byte>`如何使用类似`std::basic_istream<std::byte>`
【发布时间】:2017-09-29 20:39:50
【问题描述】:

本题旨在将std::byte 与标准输入输出结合使用。

是否有计划在未来的标准中为basic_istream&lt;CharT&gt;basic_ostream&lt;CharT&gt; 的接口添加适当的read(_bytes)write(_bytes) 函数重载?有什么理由反对它?我知道应该保留CharT*-overloads。我可以做什么来使用std::byte?我目前在我的项目功能中定义

std::istream& read(std::istream&, std::byte*, std::streamsize)
std::ostream& write(std::ostream&, const std::byte*, std::streamsize)

这些分别使用reinterpret_cast&lt;&gt;char*const char* 但我相信这取决于char 的大小。我错了吗? char 总是 1 byte 吗?

我尝试创建std::basic_istream&lt;std::byte&gt;,但它缺少std::char_traits&lt;std::byte&gt; 等等。有人已经让这种东西工作了吗?

【问题讨论】:

  • std::byte 的全部目的是去掉那种东西并将类型剥离回CHAR_BIT 位的集合。您想解决什么问题,而char 无法解决?请详细说明真正的问题。 “char 是否总是 1 个字节?” 是的。
  • 好吧,我正在读取一个二进制文件并进行一些字节操作。然后我正在编写一个二进制文件。我认为std::byte 是合适的类型。
  • @Maikel——“做一些字节操作”中的“字节”一词与std::byte中的“字节”不同。
  • @Maikel:不是。只需使用我们使用了数十年的相同类型即可。
  • 感觉你的问题无缘无故被抛弃了。 std::byte 类型旨在访问原始内存并执行按位操作(包括操作),这听起来与您想要实现的完全一样。是的,我们可以用char 的流实现相同的效果,但在某些情况下std::byte 会更好地模拟流内容。你不是唯一一个想知道的人:reddit.com/r/cpp/comments/fe72kp/modern_stdbyte_stream_io_for_c

标签: c++ io std c++17


【解决方案1】:

不要。

无论你是在“文本模式”还是“二进制模式”下操作,基本上你仍然在做的是作用于字符

std::byte 不是为此目的,这就是它没有这些功能的原因。确实,它是故意引入的不是拥有它们!

enum class byte : unsigned char {} ; (C++17 起)

std::byte 是一种独特的类型,它实现了 C++ 语言定义中指定的字节概念。

charunsigned char 一样,它可用于访问其他对象(object representation)占用的原始内存,但与那些类型不同,它不是字符类型,也不是算术类型。字节只是位的集合,只为它定义了位逻辑运算符。

http://en.cppreference.com/w/cpp/types/byte


有人已经让这种东西工作了吗?

不,如上所述,每个人都故意不这样做。

使用charunsigned char,就像我们几十年来所做的那样!

【讨论】:

  • std::byte 将是“原始”访问文件存储的正确类型,就像它适用于“原始”访问内存存储一样。但是,C++ iostreams 都包含一个转换方面并且不提供“原始”访问,因此std::byte 不是 iostreams 的正确类型。
  • @BenVoigt:即使在二进制模式下,iostreams 是否也使用翻译方面?
  • @MikeMB:是的。 std::binary 标志禁用的换行符转换是一个不同的功能。现在,作为可用的翻译方面之一,某些实现可能会提供什么都不做的翻译方面,但这不能保证,如果有的话,也没有可移植的方式来确保它被选中。
  • @BenVoigt 'std::byte 将是“原始”访问文件存储的正确类型'的假设似乎比答案“std::byte 不是为了这个目的”。当然,它不是为了格式化输出,但问题绝对不是格式化访问。但是,您还声明'C++ iostreams [...] 不提供“原始”访问':但是流未格式化的输入和输出函数呢,例如read()write() ?它们看起来确实原始
  • @AdN:正如我在之前的评论中解释的那样,read()write() 等未格式化的 I/O 函数仍会通过翻译方面。 IOstream 不执行原始(未翻译的)I/O。
【解决方案2】:

P2146: Modern std::byte stream IO for C++ 是与您的请求相关的提案。在Github 上跟踪状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-24
    • 2020-10-17
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多