Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

learnyounode 'My First I/O' example

Tags:

node.js

This program puzzles me. The goal of this program is to count the number of newlines in a file and output it in command prompt. Learnyounode then runs their own check on the file and sees if their answer matches your answer.

So I start with the answer :

var fs = require('fs');

var filename = process.argv[2];

file = fs.readFileSync(filename);

contents = file.toString();

console.log(contents.split('\n').length - 1);

learnyounode verifies that this program correctly counts the number of new lines. But when I change the program to any of the following, it doesn't print out the same number as learnyounode prints out.

file = fs.readFileSync(C:/Nick/test.txt);
file = fs.readFileSync(test.txt);

Shouldn't nodejs readFileSync be able to input an address and read it correctly?

Lastly, this program is supposed to print out the # of newlines in a program. Why does both the correct program and learnyounode print out the same number that is different from the amount of newlines everytime I run this program?

For example, the number of newlines in test.txt is 3. But running this program prints out a different number everytime, like 45, 15, 2, etc. Yet at the same time, it is verified as a correct program by learnyounode because both their answers match! What is going on?

EDIT: test.txt looks like this

ok
testing
123
like image 898
krikara Avatar asked Nov 18 '13 05:11

krikara


2 Answers

So, I tried your program on my local machine and your program works fine. I am not an expert on learnyounode. I just tried it after your question but I think I understand how it works. As such, here are the answers to your questions:

Shouldn't nodejs readFileSync be able to input an address and read it correctly?

This method from nodejs is working fine. You can try printing the contents of the file and you'll see that there are no problems.

Why does both the correct program and learnyounode print out the same number that is different from the amount of newlines everytime I run this program.

learnyounode is running your program with a different filename as input each time. It verifies the output of your program by running its own copy of correct code against the same file.

But when I change the program to any of the following, it doesn't print out the same number as learnyounode prints out.

That is because at this point, your code is processing a fixed file whereas learnyounode is still processing different files on each iteration.

like image 179
Chandranshu Avatar answered Oct 29 '22 08:10

Chandranshu


This tripped me up too. If you read the learnyounode instructions closely they explicitly say...

"The full path to the file to read will be provided as the first command-line argument."

This means they are providing the path to their own file.

When you use process.argv[2], this is passing in the 3rd array item (the learnyounode test txt file) into your script. If you run a console.log(process.argv); you'll see the full array object looks something like this:

[ '/usr/local/bin/node',
  '/Users/user/pathstuff/learnyounode/firstio.js',
  '/var/folders/41/p2jvc80j26l7nty0sk0zs1z40000gn/T/_learnyounode_1613.txt' ]

The reason the validation numbers begin to mismatch when you substitute your own text file for their is because your file always has 3 lines whereas their unit tests keep passing in different length files via process.argv.

Hope that helps.

like image 29
Otineb Avatar answered Oct 29 '22 10:10

Otineb