如何在控制台中处理标准输入nodejs



我想编写用于解决ICPC等问题的NodeJS代码。以下是使用www.hackerrank.com的模板进行JavaScript提交的示例:

process.stdin.resume();
process.stdin.setEncoding('ascii');
var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;
process.stdin.on('data', function (data) {
    input_stdin += data;
});
process.stdin.on('end', function () {
    input_stdin_array = input_stdin.split("n");
    main();    
});
function readLine() {
    return input_stdin_array[input_currentline++];
}
/////////////// ignore above this line ////////////////////
function main() {
    var s = readLine();
    s = s.split(",");
    s = s.join(" ");
    process.stdout.write(s);
}

我想离线编码,因此我需要在Windows控制台中运行程序。对于使用 c:user user> node path file.js i在代码末尾添加的srcript srcript。

main();

和脚本运行,但不会处理标准输入。它给了我和错误,在" s = s.split(("中,错误是以下" typeerror:无法读取未定义的" 的属性'split'。如果有人知道如何做 node 处理标准输入,请帮助我。

您可以等待 SIGINT,每当输入流接收 ctrl SIGINT事件时SIGINT。如果在输入流接收SIGINT时没有SIGINT事件侦听器注册,则将发出暂停事件。

收到SIGINT时,将调用您的main()功能,返回后,process.exit()将关闭该过程。

所以而不是等待结束事件

process.stdin.on('end', function(){
    input_stdin_array = input_stdin.split("n");
    main();
});

您可以等待以下等待" sigint":

process.on('SIGINT', function(){
    input_stdin_array = input_stdin.split("n");
    main();
    process.exit();
});

我建议您修改代码以将每行的数组附加到一个数组,而不是创建一个长字符串,然后将其分开。例如

process.stdin.resume();
process.stdin.setEncoding('ascii');
var input_stdin_array = [];
var input_currentline = 0;
process.stdin.on('data', function (data) {
    input_stdin_array.push(data);
});
process.stdin.on('end', function () {
    main();    
});
function readLine() {
    if (input_currentline >= input_stdin_array.length) {
        return "";
    }
    return input_stdin_array[input_currentline++];
}
/////////////// ignore above this line ////////////////////
function main() {
    do
    {
        var line = readLine();
        console.log("Line: " + line)
    } while ((line||"") !== "")
}

另外,正如其他答案所说,您想听" Sigint"而不是" end"。

我还建议使用读取模块,例如:

var readline = require('readline');
var reader = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: true
});
var lines = [];
reader.on('line', function (line) {
    lines.push(line);
});
reader.on('close', function (line) {
    console.log('All done:');
    console.log('Lines: ', lines);
});

您可以使用Ctrl-D。

触发'关闭'
  • 首先运行此代码在任何位置保存文件。
  • 使用命令提示符,转到该文件夹。
  • 使用节点JS

    运行脚本

    节点file.js

  • 然后开始在控制台上输入您的输入。

  • 一旦完成cntrl c,并且执行了 sigint进程中编写的代码。

  • 已经对代码进行了以下更改

    process.stdin.resume();
    process.stdin.setEncoding('ascii');
    var input_stdin = "";
    var input_stdin_array = "";
    var input_currentline = 0;
    process.stdin.on('data', function (data) {
       input_stdin += data;
    });
    process.stdin.on('end', function () {
      input_stdin_array = input_stdin.split("n");
      main();    
     });
    process.on('SIGINT', function(){
       input_stdin_array = input_stdin.split("n");
       main();
       process.exit();
    });
    function readLine() {
      return input_stdin_array[input_currentline++];
    }
    /////////////// ignore above this line ////////////////////
    function main() {
      var s = readLine();
      s = s.split(",");
      s = s.join(" ");
      process.stdout.write(s);
    }
    

最新更新