Peut fscanf() lecture espaces?
J'ai déjà un peu de code pour lire un fichier texte à l'aide de fscanf()
, et maintenant j'ai besoin de les modifier de sorte que les champs qui ont été précédemment espaces libres doivent permettre d'espaces. Le fichier texte est essentiellement sous la forme de:
titre: les DONNÉES
titre: les DONNÉES
etc...
qui est fondamentalement analysée à l'aide de fgets(inputLine, 512, inputFile); sscanf(inputLine, "%*s %s", &data);
, en lisant les champs de DONNÉES et d'ignorer les titres, mais maintenant certains champs de données doivent permettre d'espaces. J'ai encore besoin d'ignorer le titre et les espaces immédiatement après, mais il faut lire dans le reste de la ligne, y compris les espaces.
Est-il de toute façon pour ce faire avec le sscanf()
fonction?
Si non, quel est le plus petit changement je peux faire le code pour gérer les espaces correctement?
Mise à JOUR: j'ai édité la question de remplacer fscanf() avec fgets() + sscanf(), qui est ce que mon code est en fait l'utilisation. Je ne pense pas vraiment qu'elle l'était lorsque j'ai d'abord écrit la question qui est pourquoi je l'ai simplifié à fscanf().
- Si vous avez utilisé pour analyser en utilisant
scanf
, vous pouvez également analyser quelque chose commetitle: DATA title: DATA
(c'est à dire sur une seule ligne). Si vous souhaitez autoriser les espaces dans des valeurs, puis ce sera le terminator? Si un saut de ligne, alors, il semble que votre code d'origine a été un peu trop laxiste... - Aussi, comment voulez-vous décider de la taille de
str
tampon, et comment vous assurez-vous qu'il ne déborde pas? - oui, lorsque les DONNÉES peuvent avoir des espaces de la nouvelle ligne sera utilisée comme terminator
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas utiliser
fgets()
utiliser le%[
indicateur de conversion (avec les "exclure" option"):Mais
fgets()
est meilleur.Edit: la version avec
fgets()
+sscanf()
fgets
manière de faire "mieux"?fgets()
maintenant, dans antecipation pour le prochain changement d'exigences 🙂fgets()
+sscanf()
est un bon moyen d'analyser (simple) les chaînes de caractères.Je vous suggère fortement de vous arrêter à l'aide de
fscanf()
et commencer à utiliserfgets()
(qui lit une ligne entière) et ensuite d'analyser la ligne qui a été lu.Cela vous permettra beaucoup plus de liberté en ce qui concerne l'analyse de la non-exactement format d'entrée.
La chose la plus simple serait de délivrer un
à jeter la première partie et puis il suffit d'appeler le fgets:
Si vous insistez sur l'utilisation de
scanf
, et en supposant que vous voulez de retour à la ligne comme un terminator, vous pouvez le faire:Noter, cependant, que le ci-dessus, utilisés exactement comme c'est écrit, est une mauvaise idée, car il n'y a rien pour se prémunir contre
str
être survolées (commescanf
ne connaissez pas sa taille). Vous pouvez, bien sûr, de définir une taille maximale prédéfinie, et de préciser que, mais alors votre programme peut ne pas fonctionner correctement sur certains des entrées valides.Si la taille de la ligne, tel que défini par le format d'entrée, n'est pas limité, alors votre seule option pratique est d'utiliser
fgetc
de lire les données char par char, périodiquement la répartition de la mémoire tampon que vous allez. Si vous le faites, puis de le modifier, de supprimer tous les lire les caractères jusqu'au premier espace est assez banale.Un
%s
spécificateur de fscanf ignore les espaces d'entrée, puis lit une chaîne de caractères de non-blanc caractères et n'incluant pas le prochain caractère espace.Si vous voulez le lire jusqu'à un retour à la ligne, vous pouvez utiliser
%[^\n]
en tant que prescripteur. En outre, un ' dans la chaîne de format d'ignorer les espaces blancs à l'entrée. Donc, si vous utilisezil va lire la première chose sur la ligne jusqu'à la première d'espaces ("titre:" dans votre cas), et de la jeter, puis va lire les espaces caractères et de les jeter, alors va lire tous les caractères jusqu'à un retour à la ligne dans les str, ce qui sonne comme ce que vous voulez.
Attention que les str ne déborde pas -- vous pouvez utiliser
de limiter la longueur maximale de la chaîne que vous allez lire (100 caractères, sans compter une terminaison de NUL ici).
fscanf("%*s %[^\n]", str);
Vous êtes en cours d'exécution jusqu'à la limite de ce que l'
*scanf
famille est bon pour. Avec assez de changements minimes, vous pouvez essayer d'utiliser la chaîne de modules d'analyse de Dave Hanson C Interfaces et Implémentations. Ce truc est une modernisation de la langue de programmation Icône, d'une très simple et puissante chaîne de traitement de la langue qui Hanson et d'autres ont travaillé sur à l'Arizona. Le départ desscanf
ne sera pas trop grave, et il est plus simple, plus facile de travailler avec, et de plus en plus puissants que les expressions régulières. Le seul inconvénient, c'est que le code est un peu dur à suivre, sans le livre, mais si vous le faites bien la programmation en C, le livre est bien la peine d'avoir.