文件的所有行都相互打印

时间:2015-07-24 03:04:19

标签: ruby file-io printing io

我正在尝试将文件的内容打印到终端。当我运行脚本时,它会打印所有的行,所以我看到整个最后一行,其他行的最后一行,等等。我尝试从Powershell和cmd执行,结果相同。这是我正在运行的代码......

File.open("test.txt", "r") {|file| puts file.read}

以下是文件的内容......

  

第一行...... 1。

     

第二行...... 2

     

第三行.3

这是结果......

  

PS C:\ Users \ Alynn \ rthw> ruby ex19.rb test.txt

     

我是谁。 3。 。 2。 。 。 1。

我到处寻找,但我找不到任何理由。

3 个答案:

答案 0 :(得分:2)

这对我有用。你应该检查你的txt文件是否有。

我复制了你的例子,然后在我的irb上运行

2.2.1 :006 > File.open("lines.txt", "r") {|file| puts file.read}
    First line......1.

    Second line...2

    Third line.3
 => nil 

无论如何这是代码应该更适合你

2.2.1 :007 > puts File.read("lines.txt")
    First line......1.

    Second line...2

    Third line.3
 => nil 

答案 1 :(得分:1)

您的文本文件使用Mac OS(CR / '\r')而不是Unix(LF / '\n')或Windows(CRLF / '\r\n')换行符。在Windows(和大多数其他操作系统)上, C 到达 R eturn字符将设备位置设置为当前行的开头。这就是为什么输出被下一个输出覆盖的原因。

这取决于您的文本编辑器如何更改文本文件的换行符/行结尾。但是,也可以使用一些Ruby代码完成:

IO.write('test_fixed.txt', IO.read('test.txt', newline: :universal))

newline: :universal传递给IO.read会导致非Unix换行符转换为Unix(或Ruby称为通用)换行符。 IO.write然后将Unix换行符转换为本机(Windows)换行符。如果您不希望将newline: :universal传递给它,或者只是改为使用IO.binwrite

如果您不想编辑文本文件但仍希望获得预期的输出,它也可以与您的代码一起使用:

File.open("test.txt", "r", newline: :universal) {|file| puts file.read}

答案 2 :(得分:0)

我明白了,cremno有正确的想法。不知何故,我正在阅读的文本文件被编码为" UCS-2 Big Endian",其中Notepad ++指的是" Mac"在右下角。当我将原始文本文件转换为ANSI时,它修复了问题,这可能是为什么Horacio Branciforte无法复制问题的原因。

我通过在IO.open方法中使用编码标签来解决这个问题。谢谢你的帮助!