В чем разница между этими тремя вызовами fscanf в OCaml? - PullRequest
1 голос
/ 02 ноября 2009

Я написал небольшой фрагмент кода, чтобы просто пропустить num_lines строк во входном файле (печать строк для целей отладки. Вот две вещи, которые я пробовал, но они не работали:

for i = 0 to num_lines do
  print_endline (fscanf infile "%s" (fun p -> p));
done;;

for i = 0 to num_lines do
  print_endline (fscanf infile "%S\n" (fun p -> p));
done;;

Но этот сработал:

for i = 0 to num_lines do
  print_endline (fscanf infile "%s\n" (fun p -> p));
done;;

Я пытался понять документацию по fscanf, но она, похоже, не тонет. Может кто-нибудь объяснить мне, почему последний фрагмент сработал, а первые два - нет?

1 Ответ

3 голосов
/ 02 ноября 2009

"% s" - Соответствует всему следующему пробелу (здесь "\ n"), но никогда не соответствует "\ n"

"% S \ n" - соответствует элементу, который выглядит как строки Ocaml, затем "\ n"

"% s \ n" - Соответствует всему следующему пробелу (здесь "\ n"), затем "\ n". Это будет действовать иначе, если в файле нет завершающего символа "\ n" или если перед "\ n" и т. Д. Есть пробел и т. Д.

"% s" - Сопоставляет что угодно, вплоть до пробела, а затем все конечные пробелы, включая "\ n" (или, возможно, даже не пробелы) Это работает, потому что «» означает «любой пробел, возможно, ни одного» в строке формата.

...