【问题标题】:read part of a file after writing写入后读取文件的一部分
【发布时间】:2012-07-29 20:09:30
【问题描述】:

创建文件并将数据填充到其中后,在关闭之前,需要读取部分数据并 计算校验和。问题是您无法在关闭文件之前读取数据。代码 sn-p如下。

我的问题是如何创建文件,写入数据,读取文件的一部分,然后关闭它?一 可能的解决方案是在写入文件之前使用缓冲区,但如果 文件很大,比如MB、GB、TB、PB。

  begin
  File.open(@f_name,"w+") do |file|

    @f_old_size.times do
      file.write "1"
    end

    file.flush
    file.sync

    #################
    # read file fails
    # before close
    #################
    while line = file.gets
      puts line
    end

  end
  rescue => err
   puts "Exception: #{err}"
  end

  #####################
  # read file successfully
  # after close it
  #####################
  File.open(@f_name,"r") do |file|
    line = file.gets
    puts line
  end

【问题讨论】:

  • 我不知道 Ruby,但那些看起来像普通的 stdio fopen 标志.. 而不是使用'w',你为什么不使用'a'打开文件进行追加(阅读和写作)?
  • 在 ruby​​ 中,“a”模式不可读
  • 文件在被读取或写入时通常被锁定。一次读取/写入文件是可能的,尽管很棘手、容易出错且不被认为是好的做法。
  • 为什么要在关闭文件之前获取校验和?如果你想将校验和写入文件,那么你没有得到文件的校验和,校验和本身会改变校验和。如果你想要数据+校验和,那么你可以将数据存储在内存中,并一步存储数据和校验和。

标签: ruby file-io io


【解决方案1】:

您遇到的问题是Ruby IO 读取文件并跟踪它在文件中的位置。写出数据后,IO 对象的“搜索头”位于文件底部。当你问它下一行时,因为它在底部,你什么也得不到。

如果您将代码更改为包含 file.rewind 这样,它会起作用:

#################
# read file fails
# before close
#################
file.rewind  # <--  THIS IS THE ADDED LINE
while line = file.gets
  puts line
end

#rewind 方法将“搜索头”设置回文件的开头,这就是您要执行的操作。

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 2013-07-17
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多