从stdin读取时,无法使用CTRL D触发'end'事件

Fad*_*dwa 14 events stdin node.js

在以下代码中

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');
});
Run Code Online (Sandbox Code Playgroud)

我无法使用ctrl + D触发'end'事件,而ctrl + C只是退出而不触发它.

hello
data: hello
data
data: data
foo
data: foo
^F
data: ?
^N
data: ?
^D
data: ?
^D^D
data: ??
Run Code Online (Sandbox Code Playgroud)

小智 9

我也遇到了这个问题并在此找到了答案:Github问题

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

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


tht*_*gma 8

我改变了这个:

process.stdin.on('end', function() {
    process.stdout.write('end');
});
Run Code Online (Sandbox Code Playgroud)

对此:

process.on('SIGINT', function(){
    process.stdout.write('\n end \n');
    process.exit();
});
Run Code Online (Sandbox Code Playgroud)

更多资源:流程文档


小智 6

或者

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

猫输入.txt | 节点主.js


小智 5

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

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

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

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);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 它不会触发 process.stdin.on("end") 事件。你能帮我解决这个问题吗? (7认同)