繁体   English   中英

std::flush 不起作用,而 std::endl 起作用

[英]std::flush not working, while std::endl does

我有一个非常简单的程序,它只接受两个unsigned int输入,然后通过一个 for 循环读取 9 以下的每个数字:

input 1 : output one

input 2 : output two

等等,大于 9 则输出是偶数还是奇数。

一切顺利,除了当我调用std::flush时,它不会将缓冲区刷新到屏幕,但是std::endl会。 使用下面的代码,我没有得到 output,但是通过将flush更改为endl ,我得到了 output。这是为什么? 我尝试查找它,但我能找到的所有相关信息都是Calls to flush cout are ineffective这表示问题是插入了/r ,但我看不出这里是怎么回事,因为我可以看到所有的输出都没有。

#include <iostream>

enum integerState{belowTen,aboveNine};
enum parity{even,odd};

integerState process_integer(unsigned int n);
parity even_or_odd(unsigned int n);

int main(){
    unsigned int lowerLim,upperLim;
    std::cin >> lowerLim >> upperLim;
    for (unsigned int i=lowerLim;i<=upperLim;++i){
        process_integer(i);
    }

    return 0;
}

integerState process_integer(unsigned int n){

    switch(n){
        case 1: std::cout << "one" << std::flush;                   return belowTen;
        case 2: std::cout << "two" << std::flush;                   return belowTen;
        case 3: std::cout << "three" << std::flush;                 return belowTen;
        case 4: std::cout << "four" << std::flush;                  return belowTen;
        case 5: std::cout << "five" << std::flush;                  return belowTen;
        case 6: std::cout << "six" << std::flush;                   return belowTen;
        case 7: std::cout << "seven" << std::flush;                 return belowTen;
        case 8: std::cout << "eight" << std::flush;                 return belowTen;
        case 9: std::cout << "nine" << std::flush;                  return belowTen;
        default: 
        if(even_or_odd(n)==even){ std::cout << "even" << std::flush; return aboveNine;}
        if(even_or_odd(n)==odd){  std::cout << "odd"  << std::flush; return aboveNine;}
        return aboveNine;
    }
}

parity even_or_odd(unsigned int n){
    return (n%2==0 ? even:odd);
}

如果重要的话,我正在使用 g++。

std::flushfflush(FILE*)命令的作用相同。 它将相应文件的缓冲区清空到操作系统。 操作系统如何反应是相当不确定的。

在 Unices 下,它通常会按预期工作。 但是,在某些情况下它仍然不会刷新到屏幕上。 例如,如果您使用less (可能more ),该工具只会在收到'\n'字符后打印一行。

在 MS-Windows 下的 MS-DOS console,我觉得有很多神奇之处。 该控制台无法按照 Unices 下的预期规范工作。 它可能需要"\r\n"序列才能正常工作。 较新的版本仅适用于'\n' 冲洗通常不起作用。 相反,您需要使用完全无缓冲的控制台连接(我不记得您是如何做到的)。

在 Unices 中, open(2)命令接受包括O_DIRECTO_SYNC的标志,不仅防止缓冲,而且要求write(2) function 只有在设备写出所有数据后才返回。 这是否适用于控制台,我不确定 100%。 但这值得一试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM