【问题标题】:Unable to read lines from standard input无法从标准输入读取行
【发布时间】:2017-12-25 10:17:43
【问题描述】:

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

我想对新行的正整数求平方,从输入的每一行,我想打印输出。

下面是我的代码:

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 当我尝试通过在末尾附加 '\n' 来打印输出时,如下例所示:process.stdout.write(lines[i]*lines[i] + "\n"); 它正在打印输出并在下一行打印 0,例如,如果我发送 5 作为输入,它正在打印: 25 0 ==> 0 打印在下一行!这是我使用的 utf-8 的问题吗?

【问题讨论】:

  • 我猜process.stdout.write("" + lines[i]*lines[i]);
  • 即使它抛出了同样的问题 :( @JonasW.
  • 当我尝试在这样的输出之后添加新行 ==> process.stdout.write(lines[i]*lines[i] + "\n"); 它正在打印输出,并且在下一行打印 0,例如,如果我发送 5 作为输入,它正在打印:25 0

标签: javascript node.js stdin


【解决方案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);
  }

【讨论】:

  • 我可以在下一行打印,非常感谢。 line ** 2 好像不行!
【解决方案2】:

您可以使用 inBuilt readline 包来完成您的任务。 下面的 sn-p 将从该行读取您的输入,并且在“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

希望对你有帮助

【讨论】:

  • 谢谢 :) !但我想手动执行此操作,如我的 qsn 所示:|
【解决方案3】:
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");

    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2013-03-30
    • 2012-02-17
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多