0
的Scanf
模塊似乎表現得稍微 違反直覺的,因爲它不尊重 底層信道的狀態:如果該通道被重建如何控制Scanf.Scanning的緩衝區?
(* prepare test data *)
let() =
let oc = open_out "test.txt" in
output_string oc "abcdefghij\n";
close_out oc
;;
let ic = open_in "test.txt"
(* ic at offset 0: 「ab…」 *)
let() =
let sc = Scanf.Scanning.from_channel ic in
let s = Scanf.bscanf sc "%2s" (fun s -> s) in
Printf.eprintf "read [%s]\n" s (* -> [ab] *)
;; (* sc out of scope at this point *)
(* hint: close ic here and reopen for expected result *)
seek_in ic 4
(* ic at offset 4: 「ef…」 *)
let() =
let sc = Scanf.Scanning.from_channel ic in
let s = Scanf.bscanf sc "%2s" (fun s -> s) in
Printf.eprintf "read [%s]\n" s (* -> [cd] ‽ *)
;;
close_in ic
顯然的Scanning.t
內部緩衝器生存它 。有另一種方法來強制重新同步 ?該docs 聲稱「讀書開始於IC的當前閱讀位置。」
我會很感激在什麼地方正是這種行爲 記錄。
我正在閱讀大部分二進制文件,因此大部分時間都不需要「Scanf」。 –
您可以嘗試將文本讀入緩衝區,然後使用'sscanf'。根據我的經驗,'sscanf'比使用頻道掃描更容易使用,更加可靠。幾十年來我沒有在生產代碼中使用過scanf。如果你的文本很簡單,你也可以使用'int_of_string'等。 FWIW。 –