C ++无法从文件重定向中读取结束行字符

时间:2012-04-27 07:21:24

标签: c++ hex newline cin

这是我第一次发帖,所以请耐心等待。

我有一个文件,我需要在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?

如果需要更多信息,请与我们联系。感谢

- 凯尔

2 个答案:

答案 0 :(得分:2)

这是因为cinistream期望数据是文本。

如果您正在使用二进制数据,那么istream::getistream::read就是您要找的。

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等,它将消失。一个实现可以 合理地从文本流中删除空字节。)