いや、小難しい書き方の部類だと思うぞ。
普段の非コンピュータ感覚との乖離というか。

------------
ねこだいすき
ねこねこだいすき
ごろにゃん
------------

という3行の文章があったとして、これを
str = io.gets
するとだな、
> 一行読み込んで、読み込みに成功した時にはその文字列を返します。
というマニュアルの表現を素直に解釈すると、最初の str は、
「ねこだいすき」
になるはずだと思うだろ。でも実際は
「ねこだいすき\n」
だ。
文章ならまだしも

puts "ファイル名を入力してください"
filename=$stdin.gets

とかいうプログラム書いた場合、
filenameには改行がくっついてるというのは予想の範囲外だと思う。