我有以下代码来读取文件中的行
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
,换行。
答案 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;;