1

stdin.readByteSync 最近被添加到 Dart 中。

使用 stdin.readByteSync 进行数据输入,我试图允许默认值,如果操作员进行了输入,则清除默认值。如果没有输入并且只按下输入,则使用默认值。

然而,似乎正在发生的是在输入换行符之前不会将终端输出发送到终端。因此,当我执行 print() 或 stdout.write() 时,它会延迟到输入换行符。

因此,当操作员输入第一个字符以覆盖默认值时,默认值不会被清除。IE。默认为“abc”,输入的数据为“xx”,但输入“xx”后屏幕上显示“xxc”。“问题”似乎是在输入换行符之前没有向终端发送“写入”。

虽然我可以找到另一种方法,但我想知道这是否是 readByteSync 应该或必须工作的方式。如果是这样,我会找到另一种方法来做我想做的事。

// 示例程序 //

import 'dart:io';

void main () {
  int iInput;
  List<int> lCharCodes = [];
  print(""); print("");
  String sDefault = "abc";
  stdout.write ("Enter data : $sDefault\b\b\b");
  while (iInput != 10) {   // wait for newline
    iInput = stdin.readByteSync();
    if (iInput == 8 && lCharCodes.length > 0) { // bs
      lCharCodes.removeLast();
    } else if (iInput > 31) {   // ascii printable char
      lCharCodes.add(iInput);
      if (lCharCodes.length == 1)
        stdout.write ("    \b\b\b\b chars cleared");  // clear line
      print ("\nlCharCodes length = ${lCharCodes.length}");
    }
  }
  print ("\nData entered = ${new String.fromCharCodes(lCharCodes).trim()}");
}

命令屏幕上的结果是:

c:\Users\Brian\dart-dev1\test\bin>dart testsync001.dart


Enter data : xxc
 chars cleared
lCharCodes length = 1

lCharCodes length = 2

Data entered = xx

c:\Users\Brian\dart-dev1\test\bin>
4

2 回答 2

2

我最近添加了 stdin.readByteSync 和 readLineSync,以便更轻松地创建读取 stdin 的小脚本。但是,仍然缺少两件事,因为这是功能完整的。

1)线模式与原始模式。这基本上就是您所要求的,一种在打印后立即获取字符的方法。

2) 回声开/关。这种模式对于例如输入密码很有用,因此您可以禁用字符的默认回显。

我希望能够很快实现并实现这些功能。

您可以为这个错误加注星标以跟踪它的发展!

于 2013-07-19T11:18:01.150 回答
0

这是控制台的常见行为。尝试用stdout.flush().

编辑:我的错误。我查看了一个非常旧的修订版(dartlang-test)。当前的 API 不提供任何刷新标准输出的方法。随意提交错误。

于 2013-07-18T20:24:56.090 回答