SCANF scanne des flux d'entrée ou des chaînes codés par UTF8 et crée des données de sortie en fonction d'une chaîne de format. Il imite le comportement de la fonction c avec le même nom.
Julia> Utilisation de Scanf Julia> r, a, b = @scanf ("13 Ceci est un nombre premier", "% d% [a-za-z]", int, string) (2, 13, "Ceci est un nombre premier") # Collecte des données dans un tuplejulia heureux> r, t ... = @Scanf "1 2 -inf 4 U4119" "% d% u% e% x% s" 0 uint 0.0 int "" (5, 1, 0x0000000000000002, -inf, 4, "䄙") # chaîne de date de date de numérisation - Remarque Les pièces S et MS utilisent les valeurs par défaut Julia> F = Scanf.format "% d.% 2d.% 2d% * 1 [t]% 2d:% 2d:% 2d.% 3d "; Julia> R, Y, M, D, H, M, S, MS = Scanf ("2021.07.04T15: 53", F, Int, Zeros (int8, 5) ..., int16) (5, 2021, 7, 4, 15, 53, 0, 0)
Scanf
fournit le macro r, a,... = @scanf([io, ] "format_string", args...)
et la fonction r, a,... = scanf(io, f::Scanf.Format, args...)
.
La chaîne de format doit être un littéral de chaîne, qui est évalué une fois à l'heure d'expansion de la macro.
Alternativement f = Scanf.format"format_string"
ou f = Scanf.Format(::AbstractString)
Créez un objet de format, qui peut être utilisé dans l'appel de fonction.
Les arguments sont des valeurs par défaut des types Real
, AbstractChar
, AbstractString
, Ptr
, AbstractVector{Char}
.
Ils peuvent également être des sous-types concrets de Real
, AbstractChar
, AbstractString
, Ptr
.
Les spécificateurs de format numérique sont compatibles avec les arguments numériques et String
. Les erreurs de conversion peuvent se produire (float => int).
Si le type d'arg numérique n'est pas suffisamment large pour la valeur, les valeurs limites avec le signe correct sont stockées (par exemple Inf
, -0.0
).
Les spécificateurs de format c
, s
, [
sont tous compatibles avec les arguments Char
, Char[]
et String
. En cas de Char
le premier caractère d'une chaîne est pris.
Toutes les données de sortie sont renvoyées sous forme de tuple, y compris le nombre de valeurs attribuées comme premier élément. Si une valeur ne peut pas être analysée, la valeur par défaut est attribuée. Dans le cas d'une valeur aucune valeur dans l'élément correspondant de arg
, la valeur par défaut est dérivée du formulaire T
.
Si l'argument par défaut est un objet Vector
, les valeurs de sortie y sont également stockées.
Les chaînes de format suivent la définition de la référence C ++ - Scanf C ++ avec quelques adaptations:
Tous les caractères Unicode sont pris en charge dans les chaînes de format et les données d'entrée.
Dans les chaînes de format, les spécificateurs d'espace blanc ne sont que les caractères d'espace ASCII dans " nrtfv"
.
Dans les données d'entrée, tous les caractères x
avec isspace(x) == true
sont ignorés par n'importe quel spécificateur d'espace blanc dans la chaîne de format.
La forme %n$...
des spécifications de format n'est pas prise en charge.
Les modificateurs de type facultatif comme h
, l
, L
etc. sont ignorés; Le type cible est dérivé de l'argument par défaut correspondant, à la place.
Pour le type de spécificateur %c
, sans width
spécifiée, l'argument correspondant doit avoir du type Char
ou String
.
Pour le spécificateur de type %Nc
, avec un champ de largeur N
, l'argument doit avoir String
de type ou Vector{Char}
. Ce vecteur est réutilisé et redimensionné au nombre de caractères lus.
Le spécificateur de type %n
, renvoie une valeur entière, qui est le décalage de caractères dans les données d'entrée, consommée par ce scanf jusqu'à présent.
Le spécificateur de type %p
nécessite un argument par défaut Ptr
.
La valeur de retour des deux appels est la quantité d'arguments de sortie, suivis de toutes les données de sortie, les valeurs par défaut peut-être par défaut. Contrairement à C et C ++, les arguments pour %n
sont également comptés.
Si le flux d'entrée est épuisé avant la lecture d'un caractère, l'EOF-Indicator -1
est renvoyé à la place du nombre de valeurs attribuées.
Pour les spécificateurs de format "Whitespace", n'importe quel nombre de caractères (également zéro) x
avec isspace(x) == true
est consommé à partir du flux d'entrée.
Pour un caractère littéral spécificateur de format, le caractère suivant est lu et comparé au caractère littéral. S'il est égal, il est consommé, sinon le processus échoue.
Si le spécificateur de format "caractère" %c
est traité, au moins un caractère est lu et affecté à l'argument de sortie. Si aucun caractère n'est disponible, le processus échoue.
Si le spécificateur de format %n
est traité, aucune donnée n'est consommée (et aucun EOF renvoyé), mais la position de lecture actuelle est retournée.
Comme dérivé de la référence C ++
La fonction scanf
lit l'entrée du flux pointé par io
, sous le contrôle du format
de chaîne qui spécifie les séquences d'entrée admissibles et comment elles doivent être interprétées, en utilisant des arguments ultérieurs pour définir le type de l'entrée convertie. Le nombre d'arguments doit correspondre au nombre de spécificateurs de format requis par le format.
Le format est composé de zéro ou plus de directives: un ou plusieurs caractères (ASCII) d'espace blanc, un caractère ordinaire (UTF8) (ni un '%'
ni un caractère (ASCII) d'espace blanc), ni une spécification de conversion. Chaque spécification de conversion est introduite par le caractère '%'
. Après le '%'
, les éléments suivants apparaissent en séquence:
Un caractère d'assignation facultatif de l'assignation '*'
.
Un entier décimal facultatif supérieur à zéro qui spécifie la largeur de champ maximale (en caractères).
Un modificateur de longueur facultatif qui n'est pas utilisé par cette implémentation.
Un caractère spécificateur de conversion qui spécifie le type de conversion à appliquer.
La fonction scanf
exécute à son tour chaque directive du format. Lorsque toutes les directives ont été exécutées ou si une directive échoue (comme détaillé ci-dessous), la fonction renvoie. Les échecs sont décrits comme des défaillances d'entrée (en raison de la survenue d'une erreur de codage ou de l'indisponibilité des caractères d'entrée), ou des défaillances correspondantes (en raison d'une entrée inappropriée).
Une directive composée de caractères d'espace blanc est exécutée en lisant l'entrée jusqu'au premier caractère sans espace blanc (qui reste non lu), ou jusqu'à ce que plus de caractères puissent être lus. La directive n'échoue jamais.
Une directive qui est un caractère ordinaire est exécutée en lisant le caractère suivant du flux. Si ce caractère diffère de la directive, la directive échoue et les caractères différents et suivants restent non lus. De même, si la fin du fichier, une erreur de codage ou une erreur de lecture empêche un caractère d'être lu, la directive échoue.
Une directive qui est une spécification de conversion définit un ensemble de séquences d'entrée correspondantes, comme décrit ci-dessous pour chaque spécificateur. Une spécification de conversion est exécutée dans les étapes suivantes:
Les caractères d'espace blanc d'entrée (comme spécifié par la fonction isspace
) sont ignorés, sauf si la spécification comprend un spécificateur '['
, 'c'
ou 'n'
. Ces caractères d'espace blanc ne sont pas comptés sur une largeur de champ spécifiée.
Un élément d'entrée est lu à partir du flux, sauf si la spécification inclut un spécificateur 'n'
. Un élément d'entrée est défini comme la séquence la plus longue de caractères d'entrée qui ne dépasse aucune largeur de champ spécifiée et qui est ou est un préfixe d'une séquence d'entrée correspondante.
Le premier caractère, le cas échéant, après l'élément d'entrée n'est pas lu. Si la longueur de l'élément d'entrée est nulle, l'exécution de la directive échoue; Cette condition est une défaillance correspondante à moins que de fin de fichier, une erreur de codage ou une erreur de lecture empêchait l'entrée du flux, auquel cas il s'agit d'une panne d'entrée.
Sauf dans le cas d'un spécificateur '%'
, l'élément d'entrée (ou, dans le cas d'une directive '%n'
, le nombre de caractères d'entrée) est converti en un type approprié au spécificateur de conversion et à l'argument correspondant. Si l'élément d'entrée n'est pas une séquence correspondante, l'exécution de la directive échoue: cette condition est une défaillance correspondante. À moins que la suppression de l'affectation ne soit indiquée par A *
, le résultat de la conversion est poussé au tuple ouput.
Si le résultat de la conversion ne peut pas être représenté dans le type de sortie, une erreur de conversion est lancée.
Les modificateurs de longueur facultatifs l
, ll
, h
, hh
, L
, j
, z
, t
sont acceptés avant tous les caractères de spécificateur, mais autrement ignorés.
Les spécificateurs de conversion et leurs significations sont:
d
correspond à un entier décimal éventuellement signé, dont le format est le même que prévu pour la séquence de sujets de la fonction parse(T, _, base=10)
, où T
est le type entier de l'argument.
i
correspond à un entier signé éventuellement, dont le format est le même que prévu pour la séquence de sujets de la fonction parse(T, _, base=nothing)
.
o
correspond à un entier octal signé éventuellement, dont le format est le même que prévu pour la séquence d'objet de la fonction parse(T, _, base=8)
.
u
correspond à un entier décimal éventuellement signé, dont le format est le même que prévu pour la séquence sujet de la fonction parse(T, _, base=10)
.
x
correspond à un entier hexadécimal facultativement signé, dont le format est le même que prévu pour la séquence sujet de la fonction parse(T, _, base=16)
.
a
, e
, f
, g
correspond à un numéro de point flottant éventuellement signé, infinity
ou NaN
, dont le format est le même que prévu pour le
Séquence de sujets de la fonction parse(T, _)
, où T
est un type de point flottant.
c
correspond à une séquence de caractères du nombre exactement spécifié par la largeur du champ ( 1
si aucune largeur de champ n'est présente dans la directive). Le type d'argument doit être String
, Char
ou Vector{Char}
, si la largeur du champ est supérieure à 1
et qu'un type Char
est donné, seul le premier caractère est stocké.
s
correspond à une séquence (non vide) de caractères non blancs. Les types d'arguments sont comme pour c
.
[
Correspond à une séquence non vide de caractères d'un ensemble de caractères attendus (le scanset). Les types d'arguments sont comme pour c
. Le spécificateur de conversion comprend tous les caractères suivants de la chaîne de format, jusqu'à et y compris le support droit correspondant ( ]
). Les caractères entre les supports (la liste de balayage) composent le scanset, à moins que le caractère après le support de gauche ne soit un circonflexe ( ^
), auquel cas le scanset contient tous les caractères qui n'apparaissent pas dans la liste de balayage entre le circonflexe et le support droit. Si le spécificateur de conversion commence par []
ou [^]
, le caractère du support droit est dans la liste de balayage et le caractère suivant suivant est le support droit correspondant qui termine la spécification; Sinon, le premier caractère de support droit suivant est celui qui termine la spécification. Si -
caractère est dans la liste de balayage et n'est pas le premier, ni le second où le premier caractère est un ^
, ni le dernier caractère, il définit la plage entre le caractère gauche de -
et le caractère à droite de -
. L'ordre définissant la plage est la gamme entière de points de code Unicode des caractères. Les gammes vides (comme ba
) sont ignorées.
p
correspond à un ensemble de séquences, qui sont les mêmes que l'ensemble de séquences qui peuvent être produites par la conversion %p
de la fonction printf
. L'argument correspondant doit être de type Ptr{T}
où il peut être n'importe quel type. L'élément d'entrée est converti en valeur de pointeur d'une manière définie par l'implémentation. Si l'élément d'entrée est une valeur convertie plus tôt lors de la même exécution du programme, le pointeur qui résultats doit se comparer égal à cette valeur; Sinon, le comportement de la conversion %p
n'est pas défini.
n
Aucune contribution n'est consommée. L'argument correspondant doit être un type entier, dans lequel est converti le nombre de caractères lus à partir du flux d'entrée jusqu'à présent par cet appel à la fonction scanf
. L'exécution d'une directive %n
augmente également le nombre d'attaques retourné à la fin de l'exécution de la fonction scanf
. Si la spécification de conversion comprend un caractère de suppression de cession, aucun argument n'est consommé. Un champ de largeur facultatif est ignoré.
%
Correspond à un seul caractère '%'
; Aucune conversion ou affectation ne se produit. La spécification de conversion complète est %%
. (avec d'autres mots, %%
est traité comme un seul caractère ordinaire %
).
Si une spécification de conversion n'est pas valide, le comportement n'est pas défini.
Les spécificateurs de conversion A
, E
, F
, G
et X
sont également valides et se comportent de la même manière que, respectivement, a
, e
, f
, g
et x
L'espace blanc de fuite (y compris les caractères de la nouvelle ligne) n'est pas lu, sauf s'il est apparié par une directive. Le succès des correspondances littérales et des affectations supprimées n'est pas directement déterminable que via la directive %n
.