Ruby читает различные размеры файлов для чтения строк - PullRequest
0 голосов
/ 09 марта 2009

Мне нужно сделать что-то, где размеры файлов имеют решающее значение. Это дает странные результаты

filename = "testThis.txt"
total_chars = 0
file = File.new(filename, "r")
file_for_writing = nil
while (line = file.gets)
  total_chars += line.length
end
puts "original size #{File.size(filename)}"
puts "Totals #{total_chars}"

как это

original size 20121
Totals 20061

Почему второй не дотягивает?

Редактировать: догадки Ответов верны: тестовый файл содержит 60 строк. Если я изменю эту строку

  total_chars += line.length + 1

работает отлично. Но на * nix это изменение будет неверным?

Редактировать: Продолжение сейчас здесь Спасибо!

Ответы [ 3 ]

5 голосов
/ 09 марта 2009

В файле хранятся специальные символы, которые очерчивают строки:

  • CR LF (0x0D 0x0A) (\ r \ n) в Windows / DOS и
  • 0x0A (\ n) в системах UNIX.

Ruby's gets использует метод UNIX. Таким образом, если вы читаете файл Windows, вы потеряете 1 байт на каждую прочитанную строку, поскольку байты \ r \ n преобразуются в \ n.

Также String.length не является хорошим показателем размера строки (в байтах). Если строка не является ASCII, один символ может быть представлен более чем одним байтом (Unicode). То есть он возвращает количество символов в строке, а не количество байтов.

Чтобы получить размер файла, используйте File.size(file_name).

3 голосов
/ 09 марта 2009

Проблемы с окончанием строки являются наиболее вероятным виновником здесь.

Стоит также отметить, что если кодировка символов текстового файла отличается от ASCII, у вас также будет расхождение между двумя. Если файл UTF-8, это будет работать для английского и некоторых европейских языков, которые используют только стандартные символы алфавита ASCII. Кроме того, размер файла и количество символов могут сильно различаться (до 4 или даже 6 раз размер файла по сравнению с количеством символов).

Опираясь на «1 символ = 1 байт», просто напрашивается на неприятности, поскольку в определенный момент он почти наверняка потерпит неудачу.

3 голосов
/ 09 марта 2009

Полагаю, вы работаете в Windows, и ваш файл "testThis.txt" имеет \ r \ n окончания строк. Когда файл открывается в текстовом режиме, каждый конец строки будет преобразован в один символ \ n. Поэтому вы потеряете 1 символ в строке.

В вашем тестовом файле 60 строк? Это будет соответствовать этому объяснению.

...