IO # get работает так же, как если бы вы захватывали ввод из командной строки: «Enter» не отправляется как часть ввода; он также не передается, когда #gets вызывается для Файла или другого подкласса ввода-вывода, поэтому числа определенно не будут совпадать.
См. Соответствующий раздел Кирка
Могу я спросить, почему вас так беспокоит длина строк, суммируемая с размером файла? Возможно, вы решаете более сложную задачу, чем необходимо ...
Aha. Я думаю, я понял это сейчас.
Не имея удобного iPod (или любого другого, если на то пошло), я не знаю, хотите ли вы ровно 4 КБ, в этом случае IO # read (4000) будет вашим другом (4000 или 4096?) если вам удобнее разбивать строки, в этом случае что-то подобное должно сработать:
class Chunkifier
def Chunkifier.to_chunks(path)
chunks, current_chunk_size = [""], 0
File.readlines(path).each do |line|
line.chomp! # strips off \n, \r or \r\n depending on OS
if chunks.last.size + line.size >= 4_000 # 4096?
chunks.last.chomp! # remove last line terminator
chunks << ""
end
chunks.last << line + "\n" # or whatever terminator you need
end
chunks
end
end
if __FILE__ == $0
require 'test/unit'
class TestFile < Test::Unit::TestCase
def test_chunking
chs = Chunkifier.to_chunks(PATH)
chs.each do |chunk|
assert 4_000 >= chunk.size, "chunk is #{chunk.size} bytes long"
end
end
end
end
Обратите внимание на использование строк чтения IO # для получения всего текста в одной лоскутке: #each или #each_line также подойдут. Я использовал String # chomp! чтобы гарантировать, что независимо от того, что делает ОС, байты в конце удаляются, чтобы \ n или что-либо еще можно было принудительно ввести в вывод.
Я бы предложил использовать File # write вместо #print или #puts для вывода, так как последние имеют тенденцию доставлять специфичные для ОС последовательности новой строки.
Если вы действительно беспокоитесь о многобайтовых символах, подумайте о том, чтобы выбрать опции each_byte или unpack (C *) и String для исправления обезьян, что-то вроде этого:
class String
def size_in_bytes
self.unpack("C*").size
end
end
Распакованная версия примерно в 8 раз быстрее, чем Every_byte на моей машине, кстати.