fscanf / fscanf_s différence de comportement
Je suis intrigué par ce qui suit différence de comportement:
//suppose myfile.txt contains a single line with the single character 's'
errno_t res;
FILE* fp;
char cmd[81];
res = fopen_s(&fp, "D:\\myfile.txt", "rb" );
fscanf(fp,"%80s",cmd); //cmd now contains 's/0'
fclose(fp);
res = fopen_s(&fp, "D:\\myfile.txt", "rb" );
fscanf_s(fp,"%80s",cmd); //cmd now contains '/0' !
fclose(fp);
Les résultats ne dépendent pas de l'ordre de l'appel (c'est à dire, appel fscanf_s d'abord, vous devez obtenir la chaîne vide (premier). Compilé sur VC++ - VS2005. Quelqu'un peut-il se reproduire? Quelqu'un peut-il m'expliquer?
Merci!
OriginalL'auteur Ofek Shilon | 2010-06-24
Vous devez vous connecter pour publier un commentaire.
De docs sur
fscanf_s()
, http://msdn.microsoft.com/en-us/library/6ybhk9kc.aspx:Et http://msdn.microsoft.com/en-us/library/w40768et.aspx:
De sorte que vous devriez l'appeler de la sorte:
OriginalL'auteur Michael Burr
fscanf_s
(et l'ensemble de lascanf_s
de la famille) nécessite de passer de la taille d'un%c
,%C
,%s
,%S
, ou%[
après le tampon lui-même; vous êtes en omettant cet argument:81
est censé être la taille de lacmd
tampon. Mais est-il? C'est une bonne manière d'écrire du code qui plante, même en dépit de l'aide de la "sécurité" de la fonction. Il devrait y avoirsizeof(cmd)
en cas de lecture dans un tableau statique de caractères, certains variable qui stocke la longueur de la mémoire tampon est alloué, ou un appel à la taille / capacité en fonction d'une donnée de la mémoire tampon. Bien que votre exemple est techniquement correct, il peut être trompeur pour beaucoup de gens.OriginalL'auteur Michael Mrozek
Votre question est étiqueté C++ et vous êtes à la compilation dans VC++, mais en utilisant fscanf? Obtenir un std::ifstream.
OriginalL'auteur Puppy