C如何使用read syscall读取字节?

时间:2017-02-25 18:47:37

标签: c filesystems system

我需要使用unsigned short系统调用来阅读read。 根据{{​​3}}:

  

read()尝试从文件描述符count读取最多fd个字节          从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或关于它的联机帮助页中都没有发现任何内容,所以我觉得它非常简单。

1 个答案:

答案 0 :(得分:3)

注意:我假设您的终端使用ASCII或UTF8。出于解释的目的,它们是等效的。

当您输入123时,read并未将其作为数字输入。它看作是一个字节序列 - 因为你说它应该看起来填充一个2 - char缓冲区,它会看到前两个字节:首先是0x31,然后是0x32。它读取第一个字节,然后读取第二个字节;它不会将它们解释为数字。当解码为ASCII或UTF8时,一系列字节发生表示一个数字是无关紧要的;所有C关心的是实际的字节序列,这就是它给你的东西。

请注意,它甚至不会看到第三个​​字节。它留在输入流中,供以后的输入操作使用。

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