Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用标准输入时等待EOF_C_File Io - Fatal编程技术网

C 使用标准输入时等待EOF

C 使用标准输入时等待EOF,c,file-io,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; } #

因此,我正在做一些事情,要求我让用户在命令窗口中键入他们想要的内容,包括新行,然后在他们按CTRL+D(EOF字符)后,我应该能够打印出所有键入的内容

我能想出如何做到这一点,每一个新的行

#include <stdio.h>

int main() 
{
  int C;

  C = getc(stdin);

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

  return 0;
}
#包括
int main()
{
INTC;
C=getc(标准偏差);
而(C!=EOF)
{
putc(C,stdout);
C=getc(标准偏差);
}
返回0;
}
我也只能使用getc和putc。最终,我想让用户输入他们想要的内容,然后根据他们随命令发送的标志,我将使用getopt修改他们给我的输入


编辑:对不起,忘了添加我的问题。我希望能够做到的是等待用户输入所有输入,然后将其全部打印出来,而不是逐行打印。我该怎么做呢

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


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


您需要某种方法来缓冲用户的输入(因为他们可能会在按下Ctrl+D键之前键入一整本小说)

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


您将需要某种方法来缓冲用户的输入(因为他们可能会在按下Ctrl+D键之前键入一整部小说)

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


那么,您的问题到底是什么?Unix中没有“EOF字符”,如果用户在tty中键入ctrl-D,它会将其作为文件结尾处理,以通知从中读取的进程。变量名更喜欢小写。您真正想做的是什么?家庭作业?完全的问题是什么?你试过做什么,你在哪里卡住了?注意,你看到的代码回荡每一行,因为输入行缓冲。如果用户键入一些非常大的行(可能是4KB或更大,取决于您的LIB),或者在行中点击“代码> CTRL+D 以强制输入刷新,那么您的代码将在完成行之前输出文本。因此,您的问题究竟是什么?UNIX中没有“EOF字符”,发生的情况是,如果用户在tty中键入ctrl-D,它会将其作为文件的结尾处理,并向从中读取的进程发送信号。变量名首选小写。您真正想做的是什么?家庭作业?完全的问题是什么?你试过做什么,你在哪里卡住了?注意,你看到的代码回荡每一行,因为输入行缓冲。如果用户键入一些非常大的行(可能是4KB或更大,取决于您的LIB),或者在行中点击“代码> CTRL+D 以强制输入刷新,您的代码将在完成行之前输出文本。好奇:为什么<代码> Offyt i=0;<代码>和非
大小\u t i=0?次要:不需要
buf[i++]=0中的
++
好奇:为什么
关闭\u t i=0和非
大小\u t i=0?次要:不需要
buf[i++]=0中的
++
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);