14.2.11 Форматированный ввод ¶
Octave предоставляет функции scanf, fscanf, и sscanf для чтения форматированного ввода. Существует два варианта каждой из этих функций. Один используется для извлечения векторов данных из файла, а другой более «похож на C».
-
:
[val, count, errmsg] =fscanf(fid, template, size)¶ -
:
[v1, v2, …, count, errmsg] =fscanf(fid, template, "C")¶ -
В первом варианте данные читаются из fid в соответствии с шаблоном, а результат возвращается в матрице val.
Необязательный аргумент размер определяет количество считываемых данных и может принимать одно из следующих значений:
Inf-
Считывается как можно больше данных, возвращается вектор-строка.
nr-
Считывается до nr элементов, возвращается вектор-строка.
[nr, Inf]-
Считывается как можно больше данных, возвращается матрица с nr строками. Если количество считанных элементов не является точным кратным nr, последний столбец заполняется нулями.
[nr, nc]Считывается до nr элементов, возвращается матрица с nr строками. Если количество считанных элементов не является точным кратным nr, последний столбец заполняется нулями.
Если размер опущен, предполагается значение
Inf.Возвращается строка, если шаблон указывает только преобразования символов.
Количество успешно прочитанных элементов возвращается в count.
При возникновении ошибки errmsg содержит сообщение об ошибке, зависящее от системы.
Во втором варианте данные читаются из fid в соответствии с шаблоном, где каждый спецификатор преобразования в шаблоне соответствует отдельному скалярному возвращаемому значению. Этот вариант более «похож на C» и также совместим с предыдущими версиями Octave. Количество успешно выполненных преобразований возвращается в count
Полное описание синтаксиса строки шаблона см. в разделе «Форматированный ввод» руководства по GNU Octave.
-
:
[val, count, errmsg] =scanf(template, size)¶ -
:
[v1, v2, …, count, errmsg] =scanf(template, "C")¶ -
Это эквивалентно вызову
fscanfс fid =stdin.В настоящее время вызов
scanfв интерактивных программах не имеет смысла.
-
:
[val, count, errmsg, pos] =sscanf(string, template, size)¶ -
:
[v1, v2, …, count, errmsg] =sscanf(string, template, "C")¶ -
Это похоже на
fscanf, за исключением того, что символы берутся из строки string, а не из потока.Достижение конца строки рассматривается как условие конца файла. Кроме значений, возвращаемых
fscanf, индекс следующего символа для чтения возвращается в pos.
Вызовы scanf внешне похожи на вызовы printf, поскольку произвольные аргументы читаются под управлением строки шаблона. Хотя синтаксис спецификаций преобразования в шаблоне очень похож на синтаксис printf, интерпретация шаблона ориентирована больше на ввод в свободном формате и простое сопоставление с образцом, а не на форматирование фиксированных полей. Например, большинство scanf преобразований пропускают любое количество «пробелов» (включая пробелы, табуляции и символы новой строки) в входном файле, и нет понятия точности для числовых преобразований ввода, как есть для соответствующих преобразований вывода. Обычно ожидается, что символы в шаблоне, отличные от пробелов, точно соответствуют символам в входном потоке. Например, обратите внимание, что sscanf парсит строку и пробелы по-разному при использовании смешанных числовых и строковых типов вывода:
teststr = "1 is a lonely number";
sscanf (teststr, "%s is a %s")
⇒ 1lonelynumber
sscanf (teststr, "%g is a %s")
⇒
1
108
111
110
101
108
121
[a, b, c] = sscanf ("1 is a lonely number", "%g is a %s %s", "C")
⇒ a = 1
⇒ b = lonely
⇒ c = number Когда происходит ошибка соответствия, scanf возвращается немедленно, оставляя первый несовпадающий символ в качестве следующего символа для чтения из потока, и scanf возвращает все элементы, которые были успешно преобразованы.
Функции форматированного ввода используются не так часто, как функции форматированного вывода. Отчасти это связано с тем, что для их правильного использования требуется определённая тщательность. Другая причина заключается в том, что восстановить после ошибки сопоставления трудно.
Подробное описание разрешённых в строке шаблона флагов и модификаторов, а также их интерпретации, см. в следующих разделах.
© 1996–2023 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.2.0/Formatted-Input.html