无法从标准输入

时间:2017-12-25 10:17:43

标签: javascript node.js stdin

我正在尝试从标准输入中读取行

我想对新行中的正整数进行平方,并且从每行输入中,我想打印输出。

以下是我的代码:

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

var stdin = '';
var chunk = '5\n25';
process.stdin.on('data', function (chunk) {
    stdin += chunk;
}).on('end', function() {
    var lines = stdin.split('\n');
    for(var i=0; i<lines.length; i++) {
        process.stdout.write(lines[i]*lines[i]);
    }
});

这是一个错误:

    throw new TypeError(
    ^

TypeError: Invalid data, chunk must be a string or buffer, not number

我真的不明白我写错了代码!感谢帮助。

修改1 当我尝试通过附加&#39; \ n&#39;来打印输出时最后如下例所示:process.stdout.write(lines[i]*lines[i] + "\n");它正在打印输出,并在下一行中输出0,例如,如果我发送5作为输入它正在打印: 25 0  ==&GT;在下一行打印0!这是我使用的utf-8的问题吗?

3 个答案:

答案 0 :(得分:1)

 process.stdout.write(lines[i]*lines[i]);

导致

的行
 TypeError: Invalid data, chunk must be a string or buffer, not number

因为您正在尝试将数字传递给流。解决方案是将数字转换为字符串:

 process.stdout.write("" + lines[i] ** 2);

现在当你应用它时,它可以工作,但它总是在结果后输出0。那是因为每次输入都是按Enter键发送的,这会将\n添加到输入中,例如:

 1 \n 2 \n

现在你这样做

 var lines = stdin.split('\n');

所以行将是

 ["1", "2", ""]

那个方块将是

 1, 4, 0 // as "" => 0

所以0是由输入末尾的空行引起的。所以你可以检查一下:

  for(const line of stdin.split('\n')){
    if(!line) continue;
    console.log(line ** 2);
  }

答案 1 :(得分:0)

您可以使用inBuilt readline包来完成您的任务。 以下片段将从该行读取您的输入,并且“Enter”也将拍摄响应。

var readline = require('readline');
var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

rl.on('line', function(line){
    console.log('Square of '+line+ ' : ' + line * line );
})

输出:

ValerianP-Macbook:src valerianpereira$ node app.js
25
Square of 25 : 625
66
Square of 66 : 4356
2
Square of 2 : 4
3
Square of 3 : 9
7
Square of 7 : 49

手动方法代码

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

process.stdin.on('data', function (chunk) {
    chunk = chunk.toString().trim();
    process.stdout.write('Square of ' + chunk + ' : ' + chunk * chunk + '\n');
});

输出:

ValerianP-Macbook:src valerianpereira$ node app.js
4
Square of 4 : 16
6
Square of 6 : 36
78
Square of 78 : 6084
22
Square of 22 : 484

希望这有帮助

答案 2 :(得分:-1)

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

var stdin = '';

process.stdin.on('data', function (chunk) {

    stdin += chunk;

}).on('end', function() {
    var lines = stdin.split('\n');

    lines = lines.filter(Boolean);

    for(var i=0; i<lines.length; i++) {

        process.stdout.write(lines[i]*lines[i]+"\n");

    }
});