2013-01-09 17 views
5

Jeśli chcę czytać ze strumienia wejściowego w C piszę scanf., Czy jest równoważna metoda w NodeJS zrobić to samo?C odpowiednik scanf w nodejs

Na przykład, oto kod w C

int n, 
    m, 
    i; 

scanf("%d", &n); 

for (i = 0; i < n; i++) { 
    scanf("%d", &m); 

    ............ 

} 

Oto gdzie Zaczynam od węzła w ... TODO wskazuje, gdzie utknąłem:

process.stdin.resume(); 
process.stdin.setEncoding("ascii"); 

process.stdin.on("data", function (input) { 
    var n = +input; 
    for (var i = 0; i < n; i++) { 
     // TODO 
    } 
}); 

Odpowiedz

11

Na początek, wywołanie scanf i zdarzenie data dla czytelnego strumienia w NodeJS nie są równoważne. W przykładzie NodeJS należy przeanalizować fragment otrzymanego wejścia.

Można sprawdzić, jak te kawałki są wysłane przez zastąpienie ciała swoich na metodzie z prostym:

process.stdout.write('onData: ' + input + '\n'); 

biorąc pod uwagę jak input następnie zawierającą swoje dane będziesz musiał użyć jakiegoś sposobu, aby wyodrębnić ciąg znaków, a następnie użyj parseInt. Być może naiwne podejście do problemu, zakładając całkowitą za input 1:

var n = 0; 
var m = 0; 
var state = 0; 
process.stdin.on('data', function (input) { 
    switch (state) 
    { 
    case 0: 
     // we're reading 'n' 
     n = parseInt(input.trim(), 10); 
     state++; 
     break; 

    default: 
     // we're reading 'm' 
     m = parseInt(input.trim(), 10); 

     if (state++ == n) 
     { 
      // we've read every 'm' 
      process.exit(); 
     } 
     break; 
    } 
}); 

Nie jestem strasznie duży wentylator to znaczy uzyskania danych do pętli zdarzeń NodeJS, należy zamiast patrzeć do argumentów wiersza poleceń, pliki konfiguracyjne/wejściowe lub inne środki.

+2

+1 wspaniała odpowiedź, wyjaśnienie i porady dotyczące alternatyw – naomik

1

Funkcja ta zrobi co prosiłeś:

function readNums(s) { 
    // Split it up into numbers and spaces 
    var array = s.split(/(\d+)/); 

    // Keep just the numbers 
    array = array.filter(function(i) {return "" + +i == i}); 

    // Convert back to a number 
    array = array.map(function(i) {return +i}); 

    // How many elements should there have been? 
    var maxLen = array.shift(); 

    if (array.length < maxLen) { 
    throw "Not enough enough numbers"; 
    } else { 
    array.length = maxLen; 
    } 


    return array; 
} 

console.log(readNums("4 10 20 30 40 50 60 70")); 

Wynik:

[10, 20, 30, 40]