lunedì, dicembre 01, 2014

Esercitazioni su node.js: esercizio 3

Testo dell'esercizio
Scrivere un programma che utilizzi una singola operazione asincrona per leggere il contenuto di un file e stampare a video il numero di linee del file letto.
Il percorso completo del file verrà passato come primo argomento sulla linea di comando.

Suggerimenti
E' la versione asincrona dell'esercizio precedente. Dare un'occhiata a fs.readFile(...).
Riflettere su differenza programmazione sincrona vs asincrona.

Buon lavoro.

Una possibile soluzione

 var fs = require('fs'),  
     file = process.argv[2],  
     numeroLinee;  
   
     fs.readFile(file, function (err, contenutoFile) {  
        if (!err) {  
            numeroLinee = contenutoFile.toString().split('\n').length;  
            console.log(numeroLinee);  
        } else {  
            console.log("Problemi in lettura " + file);  
        }  
 });  

La lettura del file è asincrona, la funzione readFile non è bloccante.
Anche in questo caso si puo' specificare la codifica del file da leggere ed omettere l'invocazione del toString()

 var fs = require('fs'),  
    file = process.argv[2],  
    numeroLinee;  
   
    fs.readFile(file,'utf-8',function (err, contenutoFile) {  
        if (!err) {  
            numeroLinee = contenutoFile.split('\n').length;  
            console.log(numeroLinee);  
         } else {  
            console.log("Problemi in lettura " + file);  
         }  
 });  

Ho aggiornato su github il progetto, effettuate un git pull per aggiornare i sorgenti che avete in locale, come mostrato in questo post

Alla prox.
Ivan

7 commenti:

  1. Anonimo7:37 PM

    Ho dei problemi a capire la sintassi della virgola.
    qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
    dicono:
    You can use the comma operator when you want to include multiple expressions in a location that requires a single expression. The most common usage of this operator is to supply multiple parameters in a for loop.

    Ma che effetto ha questa dichiarazione?:
    var fs = require('fs'),
    file = process.argv[2],
    numeroLinee;

    RispondiElimina
    Risposte
    1. Ha l'effetto di dichiarare e inizializzare le 3 variabili fs,file e numeroLinee.
      E' equivalente a

      var fs = require(fs'');
      var file = process.argv[2];
      var numeroLinee;

      Elimina
    2. Scusa, numeroLinee viene solo dichiarata ma non inizializzata. Vale undefined.

      Elimina
  2. Ciao Ivan nel creare la mia soluzione,molto simile alla tua manca solo il controllo sulla lettura del file,mi sono imbattuto nel sito http://nodeschool.io/ che nel tuo stesso esercizio propone questa soluzione:

    var fs = require('fs')
    var file = process.argv[2]

    fs.readFile(file, function (err, contents) {
    var lines = contents.toString().split('\n').length - 1;
    console.log(lines);
    });

    ma così non conta e stampa una riga in meno?

    RispondiElimina
    Risposte
    1. La soluzione da te indicata presuppone semplicemente di terminare il file con un EOF, l'ultimo fine riga andrebbe ignorato e dunque da qui la presenza del -1. Spero sia chiaro :)

      Elimina
    2. Ok tutto chiarissimo :)

      Elimina