Ruby为行读取读取不同大小的文件

Ruby为行读取读取不同大小的文件,ruby,file-read,Ruby,File Read,我需要做一些文件大小至关重要的事情。这产生了奇怪的结果 filename = "testThis.txt" total_chars = 0 file = File.new(filename, "r") file_for_writing = nil while (line = file.gets) total_chars += line.length end puts "original size #{File.size(filename)}" puts "Totals #{total_cha

我需要做一些文件大小至关重要的事情。这产生了奇怪的结果

filename = "testThis.txt"
total_chars = 0
file = File.new(filename, "r")
file_for_writing = nil
while (line = file.gets)
  total_chars += line.length
end
puts "original size #{File.size(filename)}"
puts "Totals #{total_chars}"
像这样

original size 20121
Totals 20061
为什么第二个短了

编辑:回答者的直觉是正确的:测试文件中有60行。如果我换这条线

  total_chars += line.length + 1
它工作得很好。但是在尼克斯,这种改变是错误的吗


编辑:现在开始跟进。谢谢

我猜您在Windows上,并且您的“testThis.txt”文件有\r\n行结尾。以文本模式打开文件时,每行结尾都将转换为单个\n字符。因此,每行将丢失1个字符


您的测试文件中有60行吗?这与此解释是一致的。

文件中存储了一些特殊字符,用于描绘线条:

  • Windows/DOS上的CR LF(0x0D 0x0A)(\r\n)和
  • UNIX系统上的0x0A(\n)
Ruby的
获取
使用UNIX方法。因此,如果读取Windows文件,在字节转换为\r\n时,每读取一行将丢失1字节

另外,
String.length
不是字符串大小(以字节为单位)的良好度量。如果字符串不是ASCII,则一个字符可以由多个字节(Unicode)表示。也就是说,它返回字符串中的字符数,而不是字节数


要获得文件的大小,请使用
file.size(文件名)

此处最可能的罪魁祸首是行尾问题

还值得注意的是,如果文本文件的字符编码不是ASCII,那么2之间也会有差异。如果文件是UTF-8,这将适用于英语和一些仅使用标准ASCII字母符号的欧洲语言。除此之外,文件大小和字符数可能变化很大(与字符数相比,最多为文件大小的4倍甚至6倍)


依赖“1个字符=1个字节”只是自找麻烦,因为它几乎肯定会在某个时候失败。

现在真正的问题是:什么比1个字符=1个字节更好?1个字符=1个字符,1个字节=1个字节,而且两者永远不会相遇:)简单,但我明白了。如果我搞不懂,我会回敬你的。谢谢现在我已经进入第二部分。谢谢正确,该修复只适用于windoze。实际上,根据您使用的Ruby版本,str.length可能返回字节数或字符数。(我相信1.8.6及更高版本,它提供了字符数。在此之前,是字节数。)如果您计划将其移植到可移植环境中,还需要记住一件事。这很好。你介意看一下后续的内容吗?