特殊的writef / writefln行为?

时间:2012-01-03 00:03:03

标签: d

所以我一直在看D大约15分钟,所以难怪我有疑问,但是我发生了一些奇怪的事情。

我从here安装了D,从here安装了Visual D,我在Visual Studio 2010 Professional中运行了所有内容。 D示例编译并运行,调试器似乎工作正常。

在浏览dsource.org's fundamental tutorials时,当我注意到如果您使用writef而不是writefln时,我正在阅读Wait部分,那么输出的最后一行会打印< <> 暂停后。

以下是示例代码:

import std.c.stdio; /* for getch() */
import std.process; /* for system() */
import std.stdio; /* for writefln */

void main() { 
    writefln("Press a key (using 'std.c.stdio.getch();' to wait) . . .");
    getch();

    writefln("Waiting again\n(using 'system(\"pause\");'):");
    system("pause");
}

这是我的,请注意唯一的变化是writeflnwritef

import std.c.stdio; /* for getch() */
import std.process; /* for system() */
import std.stdio; /* for writefln */

void main() { 
    writef("Press a key (using 'std.c.stdio.getch();' to wait) . . .");
    getch();

    writef("Waiting again\n(using 'system(\"pause\");'):");
    system("pause");
}

使用writef,程序将不会在屏幕上显示任何内容,暂停在getch,然后当我按下某个键时,我会看到提示:

Press a key (using 'std.c.stdio.getch();' to wait) . . .Waiting again
Press any key to continue . . . 

但不是“(使用'system(”pause“);'):”。在我按下一个键以通过控制台中的“pause”命令后,会出现括号语句。如果我使用writefln打印,等待,打印两行,然后再按照您的预期再次等待。

是什么解释了这种行为?

2 个答案:

答案 0 :(得分:6)

在致电stdout.flush();write后使用writef。后面这些调用不会刷新缓冲区,这就是你看到这种行为的原因。顺便说一句getch不在std.c.stdio中(至少不在D2中?),它在DMC的CRT库(SNN.lib)中,要正确使用它,你必须将其原型为{{1} }:

extern (C) int getch();

但由于extern (C) int getch(); import std.process; /* for system() */ import std.stdio; /* for writefln */ void main() { writef("Press a key (using 'std.c.stdio.getch();' to wait) . . ."); stdout.flush(); getch(); writef("Waiting again\n(using 'system(\"pause\");'):"); stdout.flush(); system("pause"); } ,这不是跨平台兼容的。如果您想使用更好的用户输入工具,可以查看Jesse的cmdln库:https://github.com/he-the-great/JPDLibs/tree/cmdln。它有一个相当酷的界面:

getch()

答案 1 :(得分:4)

This thread on gmane.comp.lang.d.learn似乎indicate writef仅在遇到换行符时刷新输出。由于writefln是对writef的简单调用,并附加了换行符,因此writefln始终会刷新输出。在最后一个换行符之后的所有文本都被缓冲,直到程序结束。