这是我第一次发帖,所以请耐心等待。
我有一个文件,我需要在via重定向中读取标题,我使用cin捕获字节并存储它们供以后使用。
文件的hexdump是:
42 02 02 02 ff 0a 00 00 00 19 00 00 00 ff
我有什么:
char magic, cs1, cs2, cs3, selector;
char temp1, temp2, temp3, temp4;
cin >> magic;
cin >> cs1;
cin >> cs2;
cin >> cs3;
cin >> selector;
//
cin >> temp1;
cin >> temp2;
cin >> temp3;
cin >> temp4;
前5个字节代表magicNumber,channelSize,channelSize,channelSize,selectorBit。 接下来的4个字节是一个宽度值,在LSB到MSB中分成4个字节。
当我在0a上使用cin(十六进制中的10)(我想要的值)时,它将其作为换行符读取,从而跳过它。
cout << temp1 << endl;
cout << temp2 << endl;
cout << temp3 << endl;
cout << temp4 << endl;
这将包含(十六进制):
0
0
0
19
cin跳过0a并抓取下一个值。有没有办法强迫它读0a?
如果需要更多信息,请与我们联系。感谢
- 凯尔
答案 0 :(得分:2)
这是因为cin
,istream
期望数据是文本。
如果您正在使用二进制数据,那么istream::get
和istream::read
就是您要找的。 p>
std::cin.get(temp1)
std::cin.get(temp2)
std::cin.get(temp3)
std::cin.get(temp4)
从输入流中检索四个字节值。
char buff[4];
std::cin.read(buff, 4);
将数据块读取为一系列字符。您可以使用普通整数 如果字节顺序与数据匹配。
答案 1 :(得分:0)
您的代码存在两个问题。首先是你正在使用
>>
读取二进制数据; >>
用于读取格式化文本数据。 (在
特别是,>>
做的第一件事就是跳过空格。)第二件事
是你试图从cin
读取二进制数据。这是未定义的
行为,因为cin
在文本模式下打开。在系统上
两个是相同的(Unix),它会起作用,但在其他方面,你可能会遇到
各种惊喜。 (您显示的确切数据可能会工作
Windows也是,取决于库的实现,但其他
二进制数据将失败:0x1A通常会导致文件结束0x0D
如果后跟一个0x0A等,它将消失。一个实现可以
合理地从文本流中删除空字节。)