2013-09-24 2 views
1

следующий скрипт узла (wc.js) возвращает значение, отличное от утилиты unix wc;fs.readFile(). ToString завершается пустой строкой

fs = require('fs'); 
//console.log(fs.readFileSync(process.argv[2]).toString().split('\n')); 
console.log(fs.readFileSync(process.argv[2]).toString().split('\n').length); 

выход на себе, является:

[email protected]:~/stuff$ wc -l wc.js 
3 wc.js 
[email protected]:~/stuff$ node wc.js wc.js 
4 

и напечатав массив, кажется, что файл прибудет будут приостановлен дополнительной пустой строка:

[email protected]:~/stuff$ node wc.js wc.js 
[ 'fs = require(\'fs\');', 
'console.log(fs.readFileSync(process.argv[2]).toString().split(\'\\n\'));', 
'//console.log(fs.readFileSync(process.argv[2]).toString().split(\'\\n\').length);', 
'' ] 

Является ли это этому ожидаемое поведение? Я не вижу, чтобы это сообщалось в документации узла.

ответ

0

Уверены ли вы, что у вас нет символа новой строки в конце вашего файла?

$ node wc.js wc.js 
[ 'fs = require(\'fs\');', 
    'console.log(fs.readFileSync(process.argv[2]).toString().split(\'\\n\'));', 
    '// console.log(fs.readFileSync(process.argv[2]).toString().split(\'\\n\').length);' ] 

Вы можете игнорировать последний символ новой строки с .replace(/\n$/, ''), который я считаю, это поведение wc.

+1

Новая строка добавляется при выполнении buffer.toString: на самом деле даже пустые файлы имеют дополнительные строки. бродяга @ precise32: ~/прочее $ сенсорного tmpfile бродячих @ precise32: ~/вещи $ узлового wc.js tmpfile бродячих @ precise32: ~/материал $ туалет -l tmpfile 0 tmpfile – deddu

+0

Я уверен, 'buffer.toString()' не добавляет символы новой строки. Причина, по которой пустая строка возвращает одну строку, состоит в том, что если '.split()' не находит подходящих мест для разделения, он возвращает массив с одним элементом, содержащим исходную строку, которая равна длине 1. 'fs.writeFileSync ('tmp', ''); fs.readFileSync ('tmp') // ' ' fs.writeFileSync ('tmp', '\ n'); fs.readFileSync ('tmp') // ' –

Смежные вопросы