Как распечатать первые 4 байта из stdin

#c #io #binary #dataformat

#c #io #двоичный #формат данных

Вопрос:

У меня есть эта программа:

 #include <iostream>
int main() {
    std::freopen(nullptr, "rb", stdin);
    char buf[4];
    std::fread(buf, 1, 4, stdin);
    std::cout << buf << std::endl;
}
  

Который, я думаю, выполняет следующее.

  1. повторно открывает stdin для чтения байтов
  2. Инициализируйте массив буферов символов размером 4
  3. считывать в buf по одному байту за раз
  4. всего 4 байта
  5. чтение из stdin
  6. распечатать содержимое буфера

У меня есть файл test , который содержит это 4s���K$d877cc15-9569-4880-aea6-64a0466ebf3ch�

И file -bi test выдает application/octet-stream; charset=binary

И когда я делаю

 cat test | main
  

Я ничего не получаю.

Но если я создам файл, test2 содержащий test123 . И сделать:

 cat test2 | main
  

Я получаю: test как и ожидалось.

Итак, это наводит меня на мысль, что я каким-то образом не могу прочитать двоичный ввод.

В чем может быть моя проблема?

Комментарии:

1. Какие четырехбайтовые значения вы ожидаете прочитать из двоичного входного файла? Что произойдет, если вы инициализируете массив для них (пропустите) чтение файла, а затем выводите буфер таким же образом? Если это сработает, вы сузили проблему до чтения. Если это не удается, речь идет о выводе.

2. Какой именно код вы ожидаете в качестве вывода четырех (предположительно) непечатаемых значений в формате ascii, если вы выводите их как четыре char с?

3. std::cout << buf[0] << " " << buf[1] << " " << buf[2] << " " << buf[3] << std::endl;

4. Почему бы просто не read четыре байта непосредственно из std::cin ?

5. Что касается вашей проблемы, запись любого char типа в std::cout с помощью << оператора напечатает его в виде символов . Вам нужно преобразовать значения в целые числа (без знака). Либо как показано в комментарии @Eljay, либо с помощью static_cast (как в static_cast<unsigned>(buf[0]) )