以二进制模式打开文件并保存将添加新行

Qia*_*iao 2 ruby binary file-io newline

为什么要在文件的每一行中添加新行?

text = File.read('1.txt', mode: 'rb', encoding: 'UTF-8')  
File.write('1.txt', text, encoding: 'UTF-8')
Run Code Online (Sandbox Code Playgroud)

如果删除二进制模式,这又是正常的,但是我需要将其用于其他编码(UTF-16LE)。

测试它-http://asdfasd.net/ruby/binary_adds_newline.zip

Dan*_*ers 5

我进行了一些测试;这取决于您的行结束方式。当他们与最终无论是 LF\n)或CR\r)像你期望它会产生输出。也就是说,不添加任何新行。但是,如果有CRLF\r\n),它将CR在每行之后添加一个字符,从而有效地结束它,CRCR+LF从而产生多余的行。

大多数编程编辑器都允许您选择使行尾可见的选项。

我不确定为什么会发生这种情况,但可能与IO文档中的'b'模式下的以下代码段有关:

在Windows上禁止EOL <-> CRLF转换。

看起来,当使用二进制模式时,CRLF(Windows上的默认行尾)将转换为LF。因此,简单的解决方案似乎只是将全部替换\r\n\n\r。您可以这样做:

File.open('converted.txt', 'wb') do |converted|
  File.open('1.txt', 'rb').each_line do |line|
    converted << line.gsub("\r\n", "\n") # Replace CRLF with LF
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您在同一文件上多次运行脚本,则应确保在用回写之前将CRLF替换为LF:

# Note the .gsub at the end here
text = File.read('1.txt', mode: 'rb', encoding: 'UTF-8').gsub("\r\n", "\n")
File.write('1.txt', text, encoding: 'UTF-8')
Run Code Online (Sandbox Code Playgroud)