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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top