[英]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::flush
与fflush(FILE*)
命令的作用相同。 它将相应文件的缓冲区清空到操作系统。 操作系统如何反应是相当不确定的。
在 Unices 下,它通常会按预期工作。 但是,在某些情况下它仍然不会刷新到屏幕上。 例如,如果您使用less
(可能more
),该工具只会在收到'\n'
字符后打印一行。
在 MS-Windows 下的 MS-DOS console,我觉得有很多神奇之处。 该控制台无法按照 Unices 下的预期规范工作。 它可能需要"\r\n"
序列才能正常工作。 较新的版本仅适用于'\n'
。 冲洗通常不起作用。 相反,您需要使用完全无缓冲的控制台连接(我不记得您是如何做到的)。
在 Unices 中, open(2)
命令接受包括O_DIRECT
和O_SYNC
的标志,不仅防止缓冲,而且要求write(2)
function 只有在设备写出所有数据后才返回。 这是否适用于控制台,我不确定 100%。 但这值得一试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.