24

在下面的代码中

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function(chunk) {
  process.stdout.write('data: ' + chunk);
});

process.stdin.on('end', function() {
  process.stdout.write('end');
});

我无法使用 ctrl+D 触发“结束”事件,而 ctrl+C 只是退出而不触发它。

hello
data: hello
data
data: data
foo
data: foo
^F
data: ♠
^N
data: ♫
^D
data: ♦
^D^D
data: ♦♦
4

5 回答 5

16

我会改变这个:

process.stdin.on('end', function() {
    process.stdout.write('end');
});

对此:

process.on('SIGINT', function(){
    process.stdout.write('\n end \n');
    process.exit();
});

更多资源:流程文档

于 2013-05-06T17:29:52.790 回答
11

我也遇到了这个问题,在这里找到了答案:Github issue

windows本身提供的readline接口(比如你现在使用的那个)不支持^D。如果您想要更多 unix-y 行为,请使用 readline 内置模块并将 stdin 设置为原始模式。这将使节点解释原始按键并且 ^D 将起作用。请参阅http://nodejs.org/api/readline.html

如果你在 Windows 上,readline 接口默认不支持 ^D。您需要根据链接的说明进行更改。

于 2015-09-10T06:21:06.920 回答
5

如果您在 Hackerrank 代码对工具的上下文中执行此操作,那么这是给您的。

工具的工作方式是您必须在 Stdin 部分输入一些输入,然后单击 Run,它将带您进入 stdout。

在标准输入中输入的所有输入行将由代码的 process.stdin.on("data",function(){}) 部分处理,一旦输入“结束”,它将直接进入进程.stdin.on("end", function(){}) 部分,我们可以在其中进行处理并使用 process.stdout.write("") 在标准输出上输出结果。

process.stdin.resume();
process.stdin.setEncoding("ascii");
var input = "";
process.stdin.on("data", function (chunk) {
    // This is where we should take the inputs and make them ready.
    input += (chunk+"\n");
    // This function will stop running as soon as we are done with the input in the Stdin
});
process.stdin.on("end", function () {
    // When we reach here, we are done with inputting things according to our wish.
    // Now, we can do the processing on the input and create a result.
    process.stdout.write(input);
});

您可以通过将上面的代码粘贴到代码窗口上来检查流程。

于 2018-11-21T07:29:29.527 回答
4

或者

  1. 使用包含测试数据的输入文件,例如 input.txt
  2. 将您的 input.txt 通过管道传输到节点

猫输入.txt | 节点 main.js

于 2020-06-04T17:55:22.157 回答
1

在 Mac 上使用 IntelliJ IDEA 调试 Hackerrank 代码时,我也遇到过这种情况。需要说的是,如果没有 IDEA,在终端中执行完全相同的命令 - 一切正常。

起初,我发现了这个:IntelliJ IDEA:将 EOF 符号发送到 Java 应用程序- 令人惊讶的是,Cmd+D它工作正常并发送 EOF。

然后,深入IDEA设置,我发现“其他->发送EOF”,这是Cmd+D默认设置。在向此 ( ) 添加第二个快捷方式后Ctrl+D- 一切都像我以前那样工作。

于 2020-09-18T12:41:04.340 回答