我有一个转储(.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中的“扫描格式字符串中的指示”。该问题已解决。
答案 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中的“扫描格式字符串中的指示”。该问题已解决。