如何控制fileno的输出?

时间:2017-01-22 21:07:19

标签: c file-descriptor

我正面对一段我不理解的代码:

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

我知道fileno会在此返回与sdtin相关联的文件描述符,然后read将此值放入i变量。

那么,stdin允许i与第一个“案例”相匹配的价值是什么,\n

谢谢

2 个答案:

答案 0 :(得分:2)

  

但是stdin的值应该与第一个“case”相匹配,即\ n?

case语句不会查看stdin的“值”。

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

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

答案 1 :(得分:0)

  

我知道fileno返回与此处sdtin相关联的文件描述符,

是的,虽然我怀疑你不知道这意味着什么。

  

然后read将此值放入i变量。

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

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

该程序可能存在缺陷,也许是完全错误的,尽管从所呈现的片段中无法分辨出来。如果iint类型的变量,则其表示大于一个字节,但您只读取一个字节。这将只替换表示的一个字节,结果取决于C实现和读取的数据。

该程序似乎可以尝试使用read(),但我建议改为使用getchar()

#include <stdio.h>

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

i = getchar();

/* ... */