C++ 在什么情况下,从流(末端)读取会导致失速?

C++ 在什么情况下,从流(末端)读取会导致失速?,c++,stream,C++,Stream,我的问题与使用文件描述符有关,它可以是stdin或打开的文件 我试图弄明白: 在什么情况下,从流读取会导致失速。为什么cin>>x等待用户输入,但据我所知,打开的文件上的fgets(line,len,file)从不暂停。(我知道延迟读取文件是没有意义的,但我正试图弄清楚这里的流是如何工作的。) 如何检测打开的文件与标准文本的流结束?当你从Stdin读取数据时,如果你在最后,它会等待输入。如果从一个文件中读取,并且您处于末尾,则会以某种方式触发EOF,它不会停止。我认为Stdin的流结束不一定意味

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

我试图弄明白:

  • 在什么情况下,从流读取会导致失速。为什么
    cin>>x
    等待用户输入,但据我所知,打开的文件上的
    fgets(line,len,file)
    从不暂停。(我知道延迟读取文件是没有意义的,但我正试图弄清楚这里的流是如何工作的。)
  • 如何检测打开的文件与标准文本的流结束?当你从Stdin读取数据时,如果你在最后,它会等待输入。如果从一个文件中读取,并且您处于末尾,则会以某种方式触发EOF,它不会停止。我认为Stdin的流结束不一定意味着输入结束,只是程序已经读取了所有可用的输入,对吗

  • 基本上,使用
    cin
    (或另一个
    istream
    )与
    fgets
    (或
    fscanf
    等)进行读取没有区别

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


    同样,在这两种情况下,它们实际上都是在从磁盘上的文件读取数据时暂停的——但至少在一种典型情况下,数据仍然在几十毫秒左右,因此人们通常不会察觉到。尽管如此,是的,当CPU向驱动器控制器发出读取命令时,在数据从磁盘驱动器到达之前,会有一个非常长的暂停(以CPU时钟周期的数量表示)。在少数情况下,在读取文件时,您可能会得到足够长的延迟,使其变得人类可以感知,甚至可能需要人工干预。现在很少见了,但曾几何时,读取一个特定的文件可能需要操作员安装磁带。

    从根本上说,使用
    cin
    (或另一个
    istream
    )读取与使用
    fgets
    (或
    fscanf
    )读取没有区别

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


    同样,在这两种情况下,它们实际上都是在从磁盘上的文件读取数据时暂停的——但至少在一种典型情况下,数据仍然在几十毫秒左右,因此人们通常不会察觉到。尽管如此,是的,当CPU向驱动器控制器发出读取命令时,在数据从磁盘驱动器到达之前,会有一个非常长的暂停(以CPU时钟周期的数量表示)。在少数情况下,在读取文件时,您可能会得到足够长的延迟,使其变得人类可以感知,甚至可能需要人工干预。这是非常罕见的,但在一段时间内,读取一个特定的文件可能涉及到一个操作员安装磁带。

    C标签是不相关的,<代码> fgss-()/c>的行为在C和C++之间可能是不同的。<代码> fGEs>代码>可以阻止如果<代码>文件< /C> >参数是代码> STDIN < /C> >(例如)或者,如果底层I/O设备阻塞,是否有触发暂停的具体测试用例?你已经知道了吗?@ StAdvuru-虽然C++标准代表了C标准的<代码> <代码>…那是因为STDIN没有结束。(除非它来自一个文件)C标签是不相关的,代码< > fgsSd()/c>的行为在C和C++之间可能是不同的。<代码> FGES可以阻止如果<代码>文件< /C> >参数是“代码> STDIN < /C> >,或者确实是简单地如果底层I/O设备块。任何触发拖延的具体测试用例?你已经知道了吗?@ StAdvuru-虽然C++标准代表了C标准的<代码> <代码>…那是因为STDIN没有结束。(除非它来自文件)