首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >特殊的写作/写作行为?

特殊的写作/写作行为?
EN

Stack Overflow用户
提问于 2012-01-03 00:03:03
回答 2查看 247关注 0票数 3

所以我已经盯着D看了大约15分钟了,所以我有问题也就不足为奇了,但是有些奇怪的事情发生在我身上。

我从这里安装了D,从这里安装了Visual,我在VisualStudio2010Professional中运行所有的东西。D示例编译和运行,调试器似乎运行良好。

在阅读的基础教程时,我在阅读部分时注意到,如果您使用writef而不是writefln,那么输出的最后一行将在暂停之后打印出来。

下面是示例的代码:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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处暂停,然后按下一个键就会看到提示符:

代码语言:javascript
运行
复制
Press a key (using 'std.c.stdio.getch();' to wait) . . .Waiting again
Press any key to continue . . . 

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

是什么解释了这种行为?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-03 00:18:30

在调用stdout.flush();writewritef后使用writef。这些后一种调用不会刷新缓冲区,这就是您看到这种行为的原因。顺便说一句,getch不在std.c.stdio中(至少在D2中没有),它在DMC的CRT库(SNN.lib)中,要正确地使用它,就必须将其原型为extern (C) int getch();

代码语言:javascript
运行
复制
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");
}

但是由于getch(),这并不是跨平台兼容的。如果您想使用一个更好的用户输入工具,您可以查看杰西的cmdln库:https://github.com/he-the-great/JPDLibs/tree/cmdln。它有一个相当酷的界面:

代码语言:javascript
运行
复制
auto num = require!(int, "a > 0 && a <= 10")("Enter a number from 1 to 10");
票数 6
EN

Stack Overflow用户

发布于 2012-01-03 00:17:47

gmane.comp.lang.d.learn似乎认为writef只在遇到换行符时才刷新输出。因为writefln是对writef的简单调用,并附加了一个换行符,所以writefln总是刷新输出。最后一个换行符之后的所有文本都会被缓冲,直到程序结束。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8706595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档