在ocaml中执行文件操作时如何区分空格和制表符

时间:2019-09-11 05:31:25

标签: ocaml

我有一个转储(.rem)文件,每行3个条目,由制表符-“ \ t”分隔,如下所示。

Hello    World    Ocaml
I    like    Ocaml

要从此文件中读取数据,将类型与此类文件一起传递给cast(attrbs):

type attrbs = list (string * string * string);
let chi = (open_in file : attrbs) in
let v = input_value chi in close_in chi

现在,我在“ v”中得到一个列表,我将进一步使用它。实际上,如果条目之间用空格隔开,它也可以使用。

如果一行中的所有3个条目本身都不包含任何空格,则此方法很好。我想使用另一个文件,该文件的第一个条目为带空格的字符串,第二个条目为不带空格的字符串,第三个条目为任何字符串,如下所示:

This is with spaces    Thisiswithoutspaces    Thisissomestring
Another one with spaces    Anotheronewithoutspaces    AnotherString

如果我使用提到的代码,由于它不能区分空格和制表符,因此仅使用前三个单词-“ This”,“ is”和“ with”。我希望它包含空格,并考虑“这是空格”作为整个字符串。

我尝试搜索网络,但找不到任何解决方案。

更新

问题出在我阅读它们的方式上。如果我使用诸如“%s%s%s”之类的特定格式,则只有当我们添加@字符如“%s @ \ t%s @ \ t%s”时,它们才会起作用。它的标题为:https://caml.inria.fr/pub/docs/manual-ocaml/libref/Scanf.html中的“扫描格式字符串中的指示”。该问题已解决。

2 个答案:

答案 0 :(得分:1)

很高兴您自己做到了。

但是,我不建议为此使用Scanf。您可以这样做:

match String.split_on_char '\t' (input_line chi) with
| [a;b;c] -> ...
| exception End_of_file -> ...
| l_wrong_size -> ...

这样,您不仅可以确保不依赖于Scanf的古怪行为,而且还可以轻松指定对格式错误的输入执行的操作。

答案 1 :(得分:0)

问题出在我阅读它们的方式上。如果我使用诸如“%s%s%s”之类的特定格式,则只有当我们添加@字符如“%s @ \ t%s @ \ t%s”时,它们才会起作用。它的标题为:https://caml.inria.fr/pub/docs/manual-ocaml/libref/Scanf.html中的“扫描格式字符串中的指示”。该问题已解决。