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

时间:2018-02-12 19:44:43

标签: javascript node.js

我想编写NodeJS代码来解决像ICPC这样的问题。以下是使用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:users \ user>节点路径\ file.js 运行srcript我在代码末尾添加了行

main();

并且脚本运行,但它不处理标准输入。它给了我和“s = s.split()”中的错误,错误是以下“TypeError:无法读取属性'split'of undefined”。如果有人知道怎么做 node 处理标准输入请帮助我。

3 个答案:

答案 0 :(得分:2)

您可以等待SIGINT,只要输入流收到 CTRL + C 输入,就会发出SIGINT事件,通常称为SIGINT。如果在输入流收到SIGINT时没有注册SIGINT个事件侦听器,则会发出暂停事件。

收到SIGINT后,系统会调用您的main()函数,返回后,process.exit()将关闭此过程。

所以不要等待结束事件

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

你可以等待#SIG;'如下:

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

答案 1 :(得分:1)

我建议您修改代码以附加到每行的数组,而不是创建一个长字符串然后拆分它。 e.g。

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'而不是'结束'。

我还建议使用Readline模块,如下所示:

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触发'关闭'。

答案 2 :(得分:1)

  • 首先运行此代码,将文件保存在扩展名为.js的任何位置。
  • 使用命令提示符,转到该文件夹​​。
  • 使用节点js

    运行脚本

    node 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);
    }