如何防止窥视方法将读取光标向前移动?

时间:2018-08-09 13:47:42

标签: ruby file-io

我正在编写一种拆分文本文件的方法。它有两个选择,

  • 盲目分割文件(根据给定的字节分割文件)
  • 通过保留行来分割文件(如果所分割文件的最后一行不是完整的行,则将其移至下一个分割处)

保存行的代码如下:

file.rewind # `file` is a File object with proper modes passed
lines = file.each_line

until file.eof?
  tfile.truncate(0) # `tfile` is a temporary File object which will be given to the block passed

  while tfile.size + lines.peek.size <= size
    tfile << lines.next
    tfile.flush
  end

  file_count += 1
  yield(tfile, file_count)
end

现在的问题是,如果最后一个拆分中仅保留一行,则该迭代将不会运行,因为peek在最后一个迭代中将光标移动到文件末尾,因此条件是unless的最后一次迭代产生一个true的值,然后退出循环。

如何解决将光标移到 eof 的问题?

我正在考虑将光标移到每next前一行。如果有更好的选择,请提出建议。

1 个答案:

答案 0 :(得分:1)

Enumerator#peek不会向前移动Enumerator的内部位置。但是,如果位置已经在末尾,则StopIteration会升高。问题是您根本不需要peek

那将是解决问题的正确方法(该代码未经测试,但应该可以工作):

file.rewind
tfile.truncate(0)

total_files =
  file.each_line.with_object(file_count: 0) do |line, acc|
    if tfile.size + line.size <= size
      tfile << line
      tfile.flush
    else
      acc[:file_count] += 1
      yield(tfile, acc[:file_count])

      tfile.truncate(0)
      tfile << line
      tfile.flush
    end
  end[:file_count]
yield(tfile, total_count)