Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从输入流读取std::数组_C++_Istream_Stdarray - Fatal编程技术网

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