OCaml读取\ n字符

时间:2014-05-03 23:57:29

标签: string ocaml

我有以下代码来读取文件中的行

let read_file filename =
  let lines = ref [] in
  let chan = open_in filename in
  try
    while true do
      lines := input_line chan :: !lines
    done;
    !lines
  with End_of_file ->
    close_in chan;
    List.rev !lines

但是,此代码会为字符“\ n”添加额外的“\”。
例如。

helloworld\n

被读入

helloworld\\n

我该如何关闭它以便我得到helloworld\n
非常感谢你!

修改

所以我测试了这个:

let read_file filename =
  let lines = ref [] in
  let chan = open_in filename in
  try
    while true do
      lines := input_line chan :: !lines
    done;
    !lines
  with End_of_file ->
    close_in chan;
    List.rev !lines

let () =
  let lines = read_file "test.txt" in
  for i=1 to List.length lines
  do
    Printf.printf("%s") (List.nth lines (i-1))
  done;

的test.txt

helloworld\n

输出为helloworld\n,而不是helloworld,换行。

2 个答案:

答案 0 :(得分:2)

我严重怀疑此代码引入了额外的字符。很可能你只是误读了顶层的输出。如果你用print_string写出字符串,你会看到实际的内容。

我假设您的输入行实际上包含helloworld\n(12个字符,加上最后的换行符)。

这是OS X 10.9.2上的测试会话

$ od -c myfile
0000000    h   e   l   l   o   w   o   r   l   d   \   n  \n        
0000015
$ ocaml
        OCaml version 4.01.0

# let read_file filename =
... copy your definition above ...
# let lines = read_file "myfile";;
val lines : string list = ["helloworld\\n"]
# String.length (List.nth lines 0);;
- : int = 12
# print_string (List.nth lines 0);;
helloworld\n- : unit = ()

线长是正确的(12个字符)。额外的反斜杠就是toplevel在字符串中写反斜杠的方式。

<强>更新

你的测试文件显然包含一个实际的\n(两个字符),所以很自然这就是输出上显示的内容。如果您不希望\n显示在输出中,则应将其从输入中删除: - )

更新2

我无法摆脱你可能不习惯在低级别思考文本文件的感觉。如果这是真的,这里有一些事情要考虑。

  • Unix样式文本文件中已经的行最后都有换行符。您不需要在文件中放置\n来表示该行的结尾。您的文本编辑器(或其他文本处理应用程序)将在行的末尾为您添加换行符。

  • OCaml函数input_line 删除这些换行符(因为它们是多余的 - 每一行的末尾都有一个)。

  • 如果您希望这些换行显示在您的行列表中,您可以使用input_line chan ^ "\n"或类似内容自行添加这些换行符。

  • 或者您可以使用print_endline为您编写换行符。

(如果你已经知道这件事我很抱歉。)

答案 1 :(得分:0)

以下是我使用Str.regexp

进行解析所做的工作
let newlinereg = Str.regexp "\\\\n" in                                                                                                                                                      
let replacednewline = Str.global_replace newlinereg "\n" output_string in                                                                                                                                                              
let tabreg = Str.regexp "\\\\t" in                                                                                                                                                  
let final_string = Str.global_replace tabreg "\t" replacednewline in
final_string;;