【问题标题】:Ruby Premature EOF?红宝石过早的EOF?
【发布时间】:2011-09-21 12:39:21
【问题描述】:

我正在尝试用 Ruby 将一个文件写入另一个文件,但输出似乎过早停止。

输入文件 - 带有 base64 嵌入字体的大型 CSS 文件

输出文件 - 基本 html 文件。

#write some HTML before the CSS (works)
...
#write the external CSS (doesn't work, output finished prematurely)
while !ext_css_file.eof()        
    out_file.puts(ext_css_file.read())
end
...
#write some HTML after the CSS (works)

生成的文件基本上是一个有效的 HTML 文件,带有截断的 CSS(在嵌入字体的中间)

当对 read() 的结果执行 put 时,我得到相同的结果:CSS 文件只读到最后一个字符串:“RMSHhoPCAGt/mELDBESFBQSggGfAgESKCUAAAAAAAwAlgABAAAAAAAABAAUADAABAAAAAAAC”

【问题讨论】:

  • 不确定 puts/read/eof 是否能很好地协同工作。您是否尝试过将文件读入字符串然后将其写入字符串?或者:使用读/写

标签: ruby base64 eof


【解决方案1】:

如果不深入了解 CSS 文件实际包含的内容,就很难提供详细的解决方案。根据您上面的代码,我会尝试这样的事情:

#write some HTML before the CSS (works)
...
#write the external CSS (doesn't work, output finished prematurely)
out_file.puts(ext_css_file.read())
...
#write some HTML after the CSS (works)

我认为您不需要.eof 检查,因为read 方法读取并返回整个文件内容,或者如果在文件末尾则返回一个空字符串或nil。见这里:http://apidock.com/ruby/IO/read

我倾向于读取和写入相同类型的数据。例如,如果我使用puts 将数据写入新文件,我将使用readlines 读取数据。如果我使用write 写入二进制数据,我将使用read 读取数据。我将与字符串或字节保持一致,而不是将两者混合。

试试这样的...

File.open('writable_file_path', 'w') do |f|
  # f.puts "some html"
  f.puts IO.readlines('css_file_path')
  # f.puts "some more html"
end

【讨论】:

    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多