在什么条件下读取(结束)流会导致停顿?

时间:2017-06-19 23:12:29

标签: c++ stream

我的问题与使用文件描述符有关,文件描述符可以是stdin或打开的文件。

我想弄明白:

  1. 在什么条件下从流中读取会导致停顿。为什么cin >> x等待用户输入,但打开的文件上的fgets(line, len, file)永远不会停止。 (我知道拖延对于读取文件没有意义,但是我想弄清楚流是如何工作的。)
  2. 如何检测打开文件与Stdin的流结束?看起来当你从Stdin读取时,如果你在最后,它等待输入。如果从文件中读取并且您在最后,则以某种方式触发EOF并且它不会停止。我认为Stdin的流结束并不一定意味着输入的结束,只是程序已经读取了所有可用的输入,对吧?

1 个答案:

答案 0 :(得分:3)

从根本上说,使用cin(或其他istream)与fgets(或fscanf等)阅读之间没有区别

在这两种情况下,如果您从标准输入读取,它们将停止等待输入,并在接收到标准输入已到达文件末尾的正确指示时返回EOF(例如, ctrl + d ,Windows上的 ctrl + z F6 。当然,如果将标准输入重定向到文件,程序将像通常那样感知文件结尾。

同样,在这两种情况下,当从磁盘上的文件读取数据时,它们实际上 停止 - 但至少在典型的情况下,仍然是几十毫秒的数量级,所以一个人通常不会感知它。尽管如此,是的,当CPU向驱动器控制器发出读取命令时,在从磁盘驱动器到达数据之前,存在长暂停(就CPU时钟周期数而言) 。在少数情况下,当您从文件中读取人类可感知的文件时,您可以获得足够长的延迟,甚至可能涉及人为干预。现在这种情况非常罕见,但曾几何时,阅读特定文件可能会涉及操作员安装磁带等问题。