如何控制fileno的输出?

How to control the output of fileno?

我遇到了一段我看不懂的代码:

read(fileno(stdin),&i,1);
switch(i)
{
    case '\n':
      printf("\a");
      break;
    ....

我知道filenoreturn这里是sdtin关联的文件描述符,然后read把这个值放到i变量中。

那么,stdin 的值应该是多少才能使 i 与第一个 "case" 匹配,即 \n

谢谢

But what should be the value of stdin to match with the first "case", i.e \n ?

case 语句不查看标准输入的 "value"。

 read(fileno(stdin),&i,1);

将单个字节读入 i(假设 read() 调用成功),如果该字节是 \n(换行符),那么它将匹配大小写。您可能需要阅读 read(2) 的手册页以了解它的作用。

I know that fileno return the file descriptor associated with the sdtin here,

是的,虽然我怀疑你不知道那是什么意思。

then read put this value in i variable.

没有。不不不不不。 read() 不会 将文件描述符的值或其任何部分放入提供的缓冲区(在您的例子中,是 i 的字节)。顾名思义,read() 尝试 文件 中读取文件描述符作为第一个参数传递。读取的字节(如果有)存储在提供的缓冲区中。

stdin代表程序的标准输入。如果您 运行 来自交互式 shell 的程序,那将对应于您的键盘。该程序尝试读取用户输入,并将其与换行符进行比较。

该程序可能存在缺陷,甚至可能是完全错误的,但仅从所提供的片段无法分辨。如果 i 是类型 int 的变量,那么它的表示大于一个字节,但您只是将一个字节读入其中。这将仅替换表示的一个字节,结果取决于 C 实现和读取的数据。

程序似乎试图做的事情可以与 read() 一起工作,但我建议改用 getchar()

#include <stdio.h>

/*
...
int i;
...
*/

i = getchar();

/* ... */