С текстовыми файлами в стиле UNIX это очень просто
f = File.new("/path/to/whatever")
num_newlines = 0
while (c = f.getc) != nil
num_newlines += 1 if c == "\n"
end
Вот и все. Для текстовых файлов MS Windows вам придется проверить
последовательность "\ r \ n" вместо просто "\ n", но это немного
труднее. Для текстовых файлов Mac OS Classic (в отличие от
Mac OS X), вы должны проверить "\ r" вместо "\ n".
Итак, да, это похоже на C. И что? С, и Руби
офигенно, потому что, когда ответ C проще всего, это то, что вы можете
ожидайте, что ваш код Ruby будет выглядеть так. Надеюсь, у тебя нет
Я уже хвастался Java.
Кстати, пожалуйста, даже не рассматривайте ни один из ответов выше
которые используют метод IO#read
или IO#readlines
, в свою очередь вызывая
Строковый метод на том, что было прочитано. Вы сказали, что не хотите
прочитать весь файл в память, и это именно то, что они делают.
Вот почему Дональд Кнут рекомендует людям понять, как программировать
ближе к оборудованию, потому что если они этого не сделают, они в конечном итоге писать
"странный код". Очевидно, вы не хотите кодировать близко к
аппаратное обеспечение, когда вам не нужно, но это должно быть здравым смыслом.
Однако вы должны научиться распознавать случаи, которые у вас есть
чтобы приблизиться к гайкам и болтам, таким как этот.
И не пытайтесь получить больше «объектно-ориентированного», чем ситуация
призывает для. Это неловкая ловушка для новичков, которые хотят посмотреть
более сложный, чем они есть на самом деле. Ты всегда должен быть рад
для тех времен, когда ответ действительно прост, и не будет
разочарован, когда нет сложности, чтобы дать вам возможность
написать «впечатляющий» код. Однако, если вы хотите выглядеть несколько
«объектно-ориентированный» и не прочь прочитать всю строку в
памяти за раз (то есть вы знаете, строки достаточно короткие), вы
может сделать это
f = File.new("/path/to/whatever")
num_newlines = 0
f.each_line do
num_newlines += 1
end
Это был бы хороший компромисс, но только если линии не слишком
долго в этом случае он может даже работать быстрее, чем мой первый
решение.