Технически, если ваш файл содержит записи, разделенные \r
, а не записи, разделенные \n
, это не текстовые файлы, состоящие из строк. Это файл в каком-то другом формате, который является текстовым форматом какой-то другой платформы. Поэтому преобразование файла в текстовый файл является очевидным решением.
Если вам нужна ваша программа для работы с символами новой строки, вам придется написать замену в input_line
, потому что она имеет встроенное понятие встроенной строки (например, LF
в unix, CR
в MacOS до OSX, CR LF
в DOS и Windows).
Поскольку вы все равно читаете весь файл в память, вы можете прочитать все это в Buffer
. Обратите внимание, что Buffer.add_channel
не будет работать, если вы заранее не знаете размер файла (и тогда вы можете также прочитать его в строку). Непроверенные:
let input_until_eof (chan : in_channel) : string =
let buf = Buffer.create 10000 and tmp = String.create 4096 and n = ref 0 in
while n := input chan tmp 0 (String.length tmp); n <> 0 do
Buffer.add_substring buf tmp
done;
Buffer.contents buf
let tolerant_newline_regexp = Str.regexp "\r\\|\n\\|\013\|\010\013?"
let input_all_lines chan : string list =
Str.split tolerant_newline_regexp (input_until_eof chan)
Если вы собираетесь проводить дальнейший анализ содержимого файла, используйте модуль Stream
или Ocamllex.