【问题标题】:All lines of a file are printing over each other文件的所有行都相互打印
【发布时间】:2015-10-14 14:15:24
【问题描述】:

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

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

这是文件的内容...

第一行......1.

第二行...2

第三行.3

结果如下...

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

T h i r d l i n e 。 3. . 2. . . 1.

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

【问题讨论】:

  • 它是否有\r 行尾而不是\r\n 或\n 行尾?使用文本编辑器(例如 Nodepad++)检查它。

标签: ruby file-io printing io


【解决方案1】:

它对我有用。您应该检查您的 txt 文件中是否有 \n。

我复制了你的示例,然后在我的 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 

【讨论】:

    【解决方案2】:

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

    这取决于您的文本编辑器如何更改文本文件的换行符/行尾。不过也可以用一些 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}
    

    【讨论】:

      【解决方案3】:

      我想通了,cremno 的想法是正确的。不知何故,我正在读取的文本文件被编码为“UCS-2 Big Endian”,Notepad++ 在右下角将其称为“Mac”。当我将原始文本文件转换为 ANSI 时,它解决了问题,这可能是 Horacio Branciforte 无法复制问题的原因。

      我通过使用IO.open 方法中的编码标签找到了答案。感谢您的帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        相关资源
        最近更新 更多