2017-02-25 64 views
0

我需要使用read系统调用来读取unsigned short。 根据the manpageC如何使用read系统调用读取字节?

读()尝试从文件描述符fd 读取多达count字节到开始buf缓冲区。

在我的情况下,unsigned short是两个字节大小,所以它可以存储数高达65535。但是,当我执行此代码:在命令行

char buf[2]; 
bytes_read = read(0, buf, 2); 
bytes_wrote = write(1, buf, 2); 

和类型,比方说,号码123,它只返回12。它不读取字节,而是符号?我怎样才能将一个超过2个符号的值读入一个2字节的缓冲区?例如,unsigned short的最大值。我在K & R或关于它的手册中没有发现任何内容,所以我认为它非常简单。

+0

是的,它读取字节。它不会_parse_他们,只是读它们。你会得到前两个字节。 –

+0

@QPaysTaxes是的,我发现它,终端有许多不同的符号。这似乎是ASCII解释! – Tehada

+1

什么编码没关系。你输入'1',然后输入'2',然后输入'3';您的代码将会读取您写入的前两个字节。它不会解释(为了方便使用ASCII)0x31,然后是0x32作为数字12;它会将其解释为0x31,然后是0x32。 –

回答

3

注:我假设您的终端使用ASCII或UTF8。为了解释的目的,它们是等价的。

当你输入,比方说,123read没有得到作为一个数字。它看到,作为一个字节序列 - 因为你说它应该看起来填充缓冲区,它看到的前两个字节:首先,0x31,然后是0x32。它读取第一个字节,然后读取第二个字节;它不会将它们解释为数字。发现字节序列发生表示解码为ASCII或UTF8时的数字是不相关的;所有C关心的是字节的实际顺序,这就是它给你的。

请注意,它甚至没有参见的第三个字节。这留在输入流中以供稍后的输入操作使用。

如果这就是你想要的,太棒了!如果您想要输入一个数字(即输入的数据字符串的值与十进制数字对齐),请查看fscanf及其相关函数。