#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;
}
Который, я думаю, выполняет следующее.
- повторно открывает stdin для чтения байтов
- Инициализируйте массив буферов символов размером 4
- считывать в buf по одному байту за раз
- всего 4 байта
- чтение из stdin
- распечатать содержимое буфера
У меня есть файл 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])
)