Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在控制台中处理标准输入节点?_Javascript_Node.js - Fatal编程技术网

Javascript 如何在控制台中处理标准输入节点?

Javascript 如何在控制台中处理标准输入节点?,javascript,node.js,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) {

我想写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>node path\file.js运行srcript,我在代码行末尾添加了

main();

脚本运行,但不处理标准输入。它在“s=s.split()”中给出了错误,错误是下面的“TypeError:无法读取未定义的属性'split'。如果有人知道如何处理标准输入,请帮助我。

您可以等待
SIGINT
,只要输入流接收到CTRL+C输入,就会发出
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();
});

我建议您修改代码,将每行追加到一个数组中,而不是创建一个长字符串然后拆分它。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’而不是‘end’

我还建议使用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触发“关闭”。

  • 首先运行此代码,将文件保存在扩展名为.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);
    }