使用stdin时等待EOF

时间:2013-02-09 23:58:20

标签: c file-io

所以我正在处理一些需要我让用户在命令窗口中输入所需内容的内容,包括新行,然后在他们按下CTRL + D(EOF字符)之后我应该能够打印出来所有打字的东西。

我能够弄清楚如何在每一条新线上做到这一点。

#include <stdio.h>

int main() 
{
  int C;

  C = getc(stdin);

  while(C != EOF)
  {
    putc(C, stdout);
    C = getc(stdin);
  }

  return 0;
}

我也只能使用getc和putc。最终我想让用户输入他们想要的内容,然后根据他们使用命令发送的标志,我将修改他们使用getopt给我的输入。

编辑:抱歉忘了添加我的问题。我想要做的是等待用户输入所有输入,然后将其全部打印出来,而不是逐行打印。我该怎么做呢

2 个答案:

答案 0 :(得分:3)

你需要一些方法来缓冲用户的输入(因为他们可能会在点击 Ctrl + D 之前输入一整本小说。)

以下是一个如何执行此操作的示例(请注意,逐个字符读取非常慢,并且使用printf将无法处理嵌入式NUL,因此您可能希望使用readwrite代替“真实”代码:

size_t bufsize = 1024; // starting size
char *buf = malloc(bufsize);
off_t i = 0;
char c;

while((c = getc(stdin)) != EOF) {
    buf[i++] = c;
    if(i == bufsize) {
        bufsize *= 2; // double buffer size to avoid constant reallocation
        buf = realloc(buf, bufsize);
        if(!buf) {
            fprintf(stderr, "YOU TYPED TOO MUCH\n");
            exit(-1);
        }
    }
}

buf[i++] = 0;
printf("%s", buf);

答案 1 :(得分:0)

你看过使用termios吗? (termios.h)你可以将stdin设置为非规范和非回显模式,它可以让你捕获按下的每一个键,包括控制字符

http://www.gnu.org/software/libc/manual/html_node/Noncanon-Example.html