C++ 从输入流读取std::数组
我想完成以下工作(代码不会按照编写的方式编译,因为C++ 从输入流读取std::数组,c++,istream,stdarray,C++,Istream,Stdarray,我想完成以下工作(代码不会按照编写的方式编译,因为>对于std::array)没有重载): constexpr数组MAGIC_字节{40,23}; 无效验证magicheader(istream和stream) { //读入应该是魔法字节的字节 数组缓冲区; stream>>buffer//这是不会编译的行; if(缓冲区!=MAGIC_字节) {/*在此处引发异常…*/} } 我知道我可以读入char[2]而不是std::array,然后让它工作,但它不会那么优雅。这似乎是一个对std::a
>
对于std::array
)没有重载):
constexpr数组MAGIC_字节{40,23};
无效验证magicheader(istream和stream)
{
//读入应该是魔法字节的字节
数组缓冲区;
stream>>buffer//这是不会编译的行;
if(缓冲区!=MAGIC_字节)
{/*在此处引发异常…*/}
}
我知道我可以读入
char[2]
而不是std::array
,然后让它工作,但它不会那么优雅。这似乎是一个对std::array
非常有用的操作符,所以我想知道它没有实现的原因是什么,或者我是否需要自己实现它 它不是标准实现的,因为数组没有单一的读/写方法。例如:
没有一个STL容器基于相同的原因定义流运算符。它不是标准实现的,因为数组没有单一的读取/写入方法。一些示例:
没有一个STL容器基于相同的原因定义流运算符。如果您不需要性能(对于2字节,您不需要),并且基于标准算法,则此方法是我的最爱:
std::copy_n(std::istream_iterator<char>{stream}, 2, begin(MAGIC_BYTES))
std::copy_n(std::istream_迭代器{stream},2,begin(MAGIC_字节))
现在
MAGIC_BYTES
可以是向量
或字符串
或其他随机访问的容器 如果您不需要性能(对于2个字节,您也不需要),则此方法是我的最爱,它基于标准算法:
std::copy_n(std::istream_iterator<char>{stream}, 2, begin(MAGIC_BYTES))
std::copy_n(std::istream_迭代器{stream},2,begin(MAGIC_字节))
现在
MAGIC_BYTES
可以是向量
或字符串
或其他随机访问的容器 我明白你的意思。但是对于std::array
来说,它基本上应该是char[2]
的方便包装,对吗?char[2]
被重载,以便>
操作符读取二进制字符流,因此std::array
具有相同的行为不是很自然的。考虑到>
操作符当前的char[2]
行为,我认为任何其他选项(如您列出的2和3)都将是非常令人惊讶的功能。我的推理有什么问题吗?@Chiunesughihara问题是,如果标准定义了运算符,应用程序很难定义自己的运算符,那么将数组作为字符串读取可能不是每个人都想要的。我理解你的观点。但是对于std::array
来说,它基本上应该是char[2]
的方便包装,对吗?char[2]
被重载,以便>
操作符读取二进制字符流,因此std::array
具有相同的行为不是很自然的。考虑到>
操作符当前的char[2]
行为,我认为任何其他选项(如您列出的2和3)都将是非常令人惊讶的功能。我的推理有什么问题吗?@Chiunesughihara问题是,如果标准定义了运算符,应用程序很难定义自己的运算符,那么将数组作为字符串读取可能不是每个人都想要的。感谢您的响应!当然,我可以考虑使用它来实现。我更好奇的是,为什么操作符首先不存在于std::array
上。我认为它应该有>
操作符,并且与char[]
的行为相同,但不确定为什么不是这样。在ChiuneSugihara,我不能给你一个答复,但是IMHOM.CODE > STD::数组比C++数组多,语义也不同。如果您需要覆盖运算符>>
您必须像std::vector
一样,感谢您的回复!当然,我可以考虑使用它来实现。我更好奇的是,为什么操作符首先不存在于std::array
上。我认为它应该有>
操作符,并且与char[]
的行为相同,但不确定为什么不是这样。在ChiuneSugihara,我不能给你一个答复,但是IMHOM.CODE > STD::数组比C++数组多,语义也不同。如果您需要覆盖运算符>>
您必须像std::vector