【问题标题】:c++ cin>>byte strange behaviorc++ cin>>byte 奇怪的行为
【发布时间】:2014-04-29 16:40:23
【问题描述】:

我有以下代码

unsigned char input;
vector <unsigned char> buffer;
while (cin >>input){
    buffer.push_back(input);
}

for (int i=0;i<buffer.size();i++)
    cout<<std::hex<<(int)buffer.at(i)<<endl;

我用二进制文件调用程序

./program <<binary_file

包括:(从十六进制编辑器查看)

0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

但是我得到以下输出:

0
1
2
3
4
5
6
7
8
e
f
10
11
12
13
14
15
16
17
18
19
1a
1b
1c
1d
1e
1f

如您所见,缺少“9”、“a”、“b”、“c”、“d”。你能解释一下出了什么问题吗?我错过了一些重要的东西吗?谢谢

或者您能建议任何其他方式如何从 cin 加载二进制文件并将其存储在

vector<unsigned char> buffer

【问题讨论】:

    标签: c++ binary cin


    【解决方案1】:

    字符 0x09 到 0x0D 是空格,因此在提取值时会被operator&gt;&gt; 忽略。如果您想读取未格式化的字符,请使用std::cin.get() 重载之一(如果您在 Windows 上编程,回车(0x0D)仍将作为行尾的一部分被忽略,除非您以二进制模式重新打开标准输入流) .

    您还可以使用std::noskipws 操纵器禁用格式化输入函数的前导空格跳过。

    【讨论】:

    • 能否请您提供一些代码来展示如何从 cin.get() 这个字节?除了字符(a,b,c,d,e,f,g,h,i,...)之外,我正在努力获得其他东西
    • 没有将std::cin 置于二进制模式的标准方法。 (另外,至少直到最近,在 Windows 下,0x1A 将被视为文本模式下的文件结尾。)
    • @JamesKanze 是的,但话说回来,我认为 windows 是唯一可以区分文本/二进制的平台,_setmode 显然有效(不像你说的那样可移植)。
    • 我更新了问题,你能看一下吗?所以唯一的问题是,它不能在 windows 上使用?
    • @user1762087:您可以在 cmets 中要求澄清,或者发一个新帖子。请不要更改现有帖子的要求。
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 2012-09-24
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2018-01-03
    • 2019-04-10
    • 2019-05-24
    相关资源
    最近更新 更多