我正在尝试将文件的内容打印到终端。当我运行脚本时,它会打印所有的行,所以我看到整个最后一行,其他行的最后一行,等等。我尝试从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。
我到处寻找,但我找不到任何理由。
答案 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方法中使用编码标签来解决这个问题。谢谢你的帮助!