C 如何使用 read 系统调用读取字节?

How does C read bytes using the read syscall?

我需要使用 read 系统调用读取 unsigned short。 根据 the manpage:

read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.

在我的例子中,unsigned short 是两个字节大小,因此它最多可以存储 65535 个数字。但是当我执行此代码时:

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

并在命令行中键入数字 123,它 returns 仅 12。它不是读取字节,而是读取符号吗?如何将包含 2 个以上符号的值读入 2 字节缓冲区?例如,unsigned short 的最大值。我在 K&R 或联机帮助页中均未找到相关信息,因此我认为它非常简单。

注意:我假设您的终端使用 ASCII 或 UTF8。就此解释而言,它们是等价的。

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

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

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