2010-07-23 11 views
2

J'ai écrit une classe de lecteur de mémoire rapide qui émule les mêmes fonctions que fread et fscanf.Comment puis-je connaître le nombre d'octets lus par sscanf_s lors de la dernière opération?

Fondamentalement, j'ai utilisé memcpy et augmenté un pointeur interne pour lire les données comme fread, mais j'ai un appel fscanf_s. J'ai utilisé sscanf_s, sauf que cela ne me dit pas combien d'octets il a lu sur les données.

Y at-il un moyen de dire combien d'octets sscanf_s lu dans la dernière opération afin d'augmenter le pointeur interne du lecteur de chaîne? Merci!

EDIT:

Et le format exemple, je suis en train de lire est: |172|44|40|128|32|28|

fscanf lit cette amende, le fait sscanf. La seule raison est que, si elle devait être:

|0|0|0|0|0|0|

La longueur serait différente. Ce que je me demande, c'est comment fscanf sait où placer le pointeur de fichier, mais pas sscanf.

+0

(après avoir édité) Je pense que vous avez besoin de '% n' – Abel

+0

duplication possible de [Lire le nombre de caractères lus par sscanf?] (Http://stackoverflow.com/questions/13503135/get-number-of-characters -read-by-sscanf) – sevko

Répondre

2

Peut-être que je suis bête, mais je vais essayer quand même. Il semble à partir des commentaires qu'il y a encore une idée fausse. Vous devez connaître la quantité d'octets. Mais la méthode renvoie uniquement le nombre de champs lus, ou EOF.

Pour obtenir la quantité d'octets, utilisez un élément que vous pouvez facilement compter ou utilisez un spécificateur de taille dans la chaîne de format. Dans le cas contraire, vous n'aurez aucune chance de savoir combien d'octets sont lus, alors que vous parcourez les champs un par un. En outre, ce que vous pouvez dire que

sscanf_s(source, "%d%d"...) 

gain de cause sur les deux entrées « 123 456 » et « 10 \ T30 », qui a une longueur différente. Dans ces cas, il n'y a aucun moyen de dire la taille, sauf si vous le convertissez. Donc: utilisez un champ de taille fixe, ou laissez-le dans l'oubli ...

Note importante: n'oubliez pas que lorsque vous utilisez %c, c'est la seule façon d'inclure les séparateurs de champs (retour à la ligne, tabulation et espace) dans la sortie. Tous les autres vont sauter les limites du champ, ce qui rend plus difficile de trouver la bonne quantité d'octets.

EDIT:
De "C++ The Complete Reference" Je viens de lire que:

%n   Reçoit une valeur entière égale à le nubmer des caractères lus jusqu'à présent

N'est-ce pas exactement ce que vous recherchiez? Ajoutez-le simplement dans la chaîne de format. C'est confirmed here, mais je ne l'ai pas testé avec sscanf_s.

+0

Accepté pour votre édition, testé et fonctionne parfaitement. J'ai accepté le vôtre parce que je sais que vous étiez le premier à répondre à cette question. Merci encore! – Gbps

+0

@Gbps: vous êtes les bienvenus, pas d'upvotes cette fois-ci? ;-). PS, voici une référence MSDN du même '% n1' au cas où quelqu'un l'aurait manqué http://msdn.microsoft.com/fr-fr/library/6ttkkkhh%28v=VS.80%29.aspx – Abel

0

From MSDN:

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l 

Chacune de ces fonctions renvoie le nombre de champs convertis avec succès et attribués; la valeur renvoyée n'inclut pas les champs lus mais non affectés. Une valeur de retour de 0 indique qu'aucun champ n'a été affecté. La valeur de retour est EOF pour une erreur ou si la fin de la chaîne est atteinte avant la première conversion.

+0

Mais que se passerait-il si vous lisiez% d,% d,% d? Il n'y a pas de spécificateur sur la durée de chacun de ces nombres sous forme de chaîne. – Gbps

+0

Si vous voulez être précis, utilisez un tableau char, comme dans char * buffer = new char [80]; 'et spécifiez la taille:' sscanf_s (anysource, "% s", buffer, 80); '. De là: http://www.gamedev.net/community/forums/topic.asp?topic_id=393967 – Abel

+0

C'est le nombre de champs! La question a demandé "nombre d'octets". – Patrick

6

Avec scanf et la famille, utilisez %n dans la chaîne de format. Il ne lira rien, mais le nombre de caractères lus jusqu'à présent (par cet appel) sera stocké dans le paramètre correspondant (attend un int*).