1

我还在学习 ruby​​,所以我确定我在这里做错了,但是在 Windows 上使用 ruby​​ 1.9.3,我在将随机 ascii 垃圾的文件写入特定大小时遇到​​问题。我需要能够编写这些文件以在我正在 QAing 的应用程序上进行测试。在 Mac 和 *nix 上,每次都正确写入文件大小。但在 Windows 上,它会生成随机大小的文件,一般在 1,024 字节到 1,031 字节之间。

我确定问题是 rstr 生成的字符之一被计为两个字符,但是......这似乎不应该发生。

这是我的代码:

num = 10
k = 1
for i in 1..num
  fname = "f#{i}.txt"
  f = File.new(fname, "w")
  for k in 1..size
    rstr = "#{(1..1024).map{rand(255).chr}.join}"
    f.write rstr
    print " #{rstr.size} "  # this returns 1024 every time.
    rstr = ""
  end
  f.close
end

也试过:

  opts = {}  
  opts[:encoding] = "UTF-8"
  fname = "f#{i}.txt"
  f = File.new(fname, "w", opts)
4

2 回答 2

2

默认情况下,在 Windows 中打开的文件以文本模式打开,这意味着调整了行尾和其他细节。

如果您希望文件完全按照您的意愿逐字节写入,则需要以二进制模式打开文件:

File.new("foo", "wb") do |f|
  # ...
end

bPOSIX 操作系统上是一个被忽略的,所以你的脚本现在是跨平台兼容的。

注意:我使用块语法来管理文件,以便在执行块后正确关闭并处理文件处理程序。您不再需要担心关闭文件 ;-)

希望这可以帮助。

于 2012-07-19T15:54:04.963 回答
0

没有任何 255 ASCII。值从 0 到 254。如果您尝试 printf 255.chr,您将得到一个多字节字符。由于 Windows 没有标准的 utf-8,因此您会得到不正确的值。因此,您面临的问题!

尝试#coding: utf-8在文件顶部添加。它应该让事情正常进行。

于 2012-07-19T15:38:09.497 回答