2016-08-26 51 views
1

我想学习d,所以我开始与你好世界,并试图扩大一点。方法调用的顺序混合

import std.stdio; 
import core.thread; 

void main(string[] args){ 
    writeln("Hello World!"); 
    Thread.sleep(dur!("seconds")(5)); 
    writeln("Press enter key to exit..."); 
    writeln(readln()); 
} 

所以我希望我的输出为以下

Hello World! 
Press enter key to exit... 
//input "abcd" 
abcd 

,而是我得到这个

//input "abcd" 
Hello World! 
Press enter key to exit.... 
abcd 

睡眠功能,甚至都不会被跳过。 发生了什么?

+0

适合我。你使用哪个版本的编译器?你如何建立和运行此代码 – Kozzi11

+0

gdc - 版本说5.4.0版本20160609.我编译 - x86_64独立--build模式 – blipman17

回答

6

这是一个常见问题解答,当我阅读标题时,我期待看到一个IDE,并且标记了它,好吧!我找不到可以链接的旧回答,但缺点是输出和睡眠都发生了,它们只是由IDE管道缓冲,直到结束才看到。

如果添加stdout.flush();权利readln之前和/或第一writeln之后你会看到输出 - 强制缓冲去的屏幕做任何事情之前。

正常的控制台输出将自动刷新一行,但IDEs被视为管道;该程序与另一个程序而不是用户交谈,因此它认为它可以通过数据块而不是用户可见线进行缓冲。

+0

我以为我疯了。我希望它不是一个缓冲区,因为它被称为* writeln()*(当你使用这个函数时,你显然想写一行代码)。我不知道我怎么会错过这个。 – blipman17

+0

是的,我们已经考虑在写入调用中使用flush,但是在正常地与管道或其他文件进行交谈时,缓冲会大大提高性能,所以在大多数情况下它正在做正确的事情......它只是因为IDE他们看起来不像图书馆。 –

+0

我认为提出两个不同版本的'writeln'的建议有和没有内置刷新已经出现。 如果我可能会问,不这样做的原因是什么? – blipman17