为什么在使用fgets时我必须输入3次EOF?

时间:2015-04-20 23:06:15

标签: c while-loop stdin eof fgets

所以基本上我想将我写入stdin(包括换行符)的所有内容复制到字符串中以用于哈希目的。我设法完成了这个并制作了一些小代码来代表我的问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFFERSIZE 10000

int main()
{
char *myStr = calloc(1,1);
char buffer[BUFFERSIZE];

while( fgets(buffer, BUFFERSIZE , stdin) != NULL ){
  myStr = realloc(myStr, strlen(myStr)+1+strlen(buffer) );
  strcat( myStr, buffer );
}
printf("\n%s\n",myStr);

}

当我输入一些文本然后按ENTER键并调用EOF后,一切正常。

但是当我启动程序时输入“a”然后我尝试调用EOF(使用 Ctrl Z + (Windows cmd提示符), Ctrl D < / kbd>(Linux))我必须做三次程序才能真正打破循环。我期待最多2次。

有人可以解释如何使用EOF,stdin和fgets吗?或者我应该使用其他东西(例如getline)?如果我不清楚我的问题,我很抱歉,只要问你需要什么。

谢谢。

1 个答案:

答案 0 :(得分:5)

首先,^ Z或^ D是对您正在使用的终端有意义的控制字符,有时表示终端发出文件结束信号。

无论如何,在输入文字后,终端会处理您的三个按键以执行以下操作:

  1. 刷新输入(即将目前为止从终端输入的字符发送到程序 - 默认情况下,当终端使用线路缓冲时不会发生这种情况)
  2. 设置文件结束条件
  3. 再次设置文件结束条件
  4. 在您的程序中对应于:

    1. 没有任何结果:即使收到afgets会一直读到文件结尾或换行符
    2. fgets因文件结尾而完成。但是,它不会返回NULL,因为读取了字符,"a"是特定的。
    3. fgets由于文件结束而完成,并返回NULL,因为没有读取字符。