Чтение в массив std :: из входного потока - PullRequest
0 голосов
/ 12 ноября 2018

Я хотел бы выполнить следующее (код не будет компилироваться, как написано, потому что >> не перегружен для std::array):

constexpr array<char, 2> MAGIC_BYTES { 40, 23 };

void VerifyMagicHeader(istream& stream)
{
    //Read in the bytes that should be the magic bytes
    array<char, 2> buffer;
    stream >> buffer //This is the line that won't compile;

    if (buffer != MAGIC_BYTES)
    {/*throw exception here...*/}
}

Я знаю, что могу читать char[2] вместо std::array<char, 2> и заставить это работать, но это не будет так элегантно. Это похоже на оператор, который был бы действительно полезен для std::array, поэтому мне интересно, есть ли причина, по которой он не реализован, или мне нужно будет его реализовать самостоятельно.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Этот метод является моим любимым, если вам не нужна производительность (а для 2-х байтов вам это не нужно) и основан на стандартных алгоритмах:

std::copy_n(std::istream_iterator<char>{stream}, 2, begin(MAGIC_BYTES))

Теперь MAGIC_BYTES может бытьvector или string, или какой-то другой контейнер с произвольным доступом!

0 голосов
/ 12 ноября 2018

Стандарт не реализован, так как нет единого способа чтения / записи массива. Некоторые примеры:

  1. в виде двоичного потока символов
  2. в виде списка через запятую (что, если один из ваших персонажей - запятая?)
  3. как список, разделенный пробелами (что, если один из ваших символов - пробел?)

Тогда, когда вы добавите в этот массив шаблонный класс, он станет еще сложнее. Как вы пишете массив массивов?

Ни один из контейнеров STL не определяет потоковые операторы по тем же причинам.

...