Rendre fscanf ignorer le paramètre facultatif
Question
J'utilise fscanf pour lire un fichier comportant des lignes telles que
Nombre & Lt; -Witespace - & Gt; chaîne < -whitespace - > colonne_3rd_ optionnelle
Je souhaite extraire le nombre et la chaîne de chaque colonne, mais ignorer la 3rd_column si elle existe
Exemple de données:
12 foo quelque chose
03 bar
24 quelque chose de #randomcomment
Je voudrais extraire 12, foo; 03, barre; 24, quelque chose en ignorant & "Quelque chose &"; et & "; #com: un &"
J'ai actuellement quelque chose comme
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
Toutefois, cela ne fonctionne pas avec les lignes sans troisième colonne. Comment puis-je le faire tout ignorer après la 2ème chaîne?
La solution
Il me semble que la solution la plus simple consiste à scanner (&% d% s &, & num; & et word), puis à fgets (). manger le reste de la ligne.
Autres conseils
Le problème est que %*s
est en train de manger le nombre sur la ligne suivante lorsqu'il n'y a pas de troisième colonne, puis que le prochain %d
échoue car le prochain jeton n'est pas un nombre. Pour résoudre ce problème sans utiliser gets()
suivi de sscanf()
, vous pouvez utiliser la classe de caractères spécifiée:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
Le [^\n]
indique de faire correspondre autant de caractères que possible qui ne sont pas des nouvelles lignes et le *
supprime l'affectation comme auparavant. Notez également que vous ne pouvez pas insérer d'espace entre %s
et %*[\n]
, car sinon, cet espace dans la chaîne de format correspondrait à la nouvelle ligne, ce qui ferait que <=> correspondrait à la ligne suivante, ce qui n'est pas le cas. tu veux.
Utilisez fgets () pour lire une ligne à la fois, puis sscanf () pour rechercher les deux colonnes qui vous intéressent. Elles sont plus robustes et vous n'avez rien de spécial à faire pour ignorer les données de fin.
J'utilise souvent gets () suivi d'un sscanf () sur la chaîne que vous venez, euh, gots.
Bonus: vous pouvez séparer le test de fin d’entrée de l’analyse.