fopen / fopen_s et l'écriture de fichiers
J'utilise fopen en C pour écrire la sortie dans un fichier texte. La déclaration de la fonction est (où ARRAY_SIZE
a été défini précédemment):
void create_out_file(char file_name[],long double *z1){
FILE *out;
int i;
if((out = fopen(file_name, "w+")) == NULL){
fprintf(stderr, "***> Open error on output file %s", file_name);
exit(-1);
}
for(i = 0; i < ARRAY_SIZE; i++)
fprintf(out, "%.16Le\n", z1[i]);
fclose(out);
}
Mes questions:
-
Sur la compilation avec MVS2008-je obtenir de l'avertissement: avertissement C4996: 'fopen": Cette fonction ou une variable peut être dangereux. Pensez à utiliser fopen_s à la place. Je n'ai pas vu beaucoup d'informations sur
fopen_s
pour que je puisse changer mon code. Toutes les suggestions? -
Peut-on instruire
fprintf
pour écrire les nombres souhaitée de la précision numérique à un fichier? Si je suis en utilisantlong double
alors je suppose que mes réponses sont bonnes jusqu'à 15 chiffres après la virgule. Suis-je le droit?
- Il n'y a rien à distance dangereux sur fopen(), mais quelques personnes à MS semblent avoir perdu de leur collectif de billes sur des fonctions qui prennent null chaînes de caractères comme des paramètres.
- Je crois que tout ceci est un complot de Microsoft pour les gens de verrouillage dans Windows uniquement de la programmation.
Vous devez vous connecter pour publier un commentaire.
fopen_s
est une variante defopen
qui contient la validation des paramètres et des mains, en retour, un code d'erreur au lieu d'un pointeur dans le cas où quelque chose se passe mal lors de la procédure ouverte. Il est plus sûr que la base de la variante de puisqu'elle représente plus de conditions de bords. Le compilateur est pour vous avertir de l'utiliser parce quefopen
représente un potentiel d'exploitation de vecteur dans votre application.Vous pouvez spécifier les chiffres de précision à la
printf
famille de fonctions en utilisant le spécificateur de%.xg
, où x est les chiffres de précision que vous voulez dans la sortie. Unlong double
varie en fonction de la précision de plate-forme à plate-forme, mais vous pouvez généralement parié être âgé d'au moins 16 chiffres de précision décimale.Edit: Pendant que je ne suis pas entièrement avec les autres qui sont ce qui suggère que
fopen_s
est un complète perte de temps, il ne représentent qu'une très faible chance d'exploitation et il n'est pas largement soutenue. Certaines autres fonctions averti en vertu de C4996 sont beaucoup plus graves vulnérabilités, cependant, et à l'aide de_CRT_SECURE_NO_WARNINGS
est l'équivalent de désactivation de l'alarme pour les deux "vous avez laissé la porte de votre chambre déverrouillé" et "vous avez laissé une bombe nucléaire dans la cuisine".Aussi longtemps que vous n'êtes pas limité à l'utilisation pure "C" de votre projet (par exemple, pour un projet scolaire ou un microcontrôleur embarqué), vous feriez bien de profiter du fait que presque tous les compilateurs C sont aussi des compilateurs C++ et du C++
iostream
variantes de l'ensemble de ces fonctions d'e/S afin d'obtenir à la fois l'amélioration de la sécurité et de compatibilité dans le même temps.J'ai rencontré un problème similaire travailler avec Visual Studio 2012, mais où mon problème a été élargi, je suis en train de construire un programme que je veux utiliser le cloches et de sifflets de Visual Studio pour tester et finalement être en mesure de compiler et d'exécuter la même application sur mon serveur Linux (je suis en train de faire un bot)
donc, c'est ce que j'ai trouvé après quelques Google-ing et j'ai pensé à la poster dans le cas où cela peut aider quelqu'un d'autre.
ce sera apaiser Visual Studio et il ne s'en plaindra pas, et il permettra également le même code à la compilation de gcc ou de tout autre conforme aux normes du compilateur c/c++
fopen_s
et tous les autres _s fonctions sont MS-spécifique "sécurisé" variantes de fonctions standard. Si votre code n'a pas besoin d'être multi-plateforme, vous pouvez simplement passer et faire le bonheur du compilateur. Sinon, il suffit d'ajouter le_CRT_SECURE_NO_WARNINGS
pré-processeur de la directive dans les paramètres de votre projet et il va arrêter de vous avertir à ce sujet.Ouais, long double est facilement bon pour une précision de 15 chiffres; en fait, même les doubles sont assez bonnes pour que beaucoup (mais pas plus).
long double
taille dépend de la plateforme; malheureusement, MSVC++ en fait le même quedouble
, donc pas utiliser vraiment. Un 64 bits double dispose de 53 bits de précision dans la mantisse, qui est d'environ 15.95 chiffres décimaux (log10(53)).D'autres affiches ont souligné que fopen n'est pas vraiment très dangereux. Si vous ne voulez pas cet avertissement, mais vous ne voulez que les autres ceux qui mettent en garde contre de véritables failles, ne pas
#define _CRT_SECURE_NO_WARNINGS
.Au lieu de cela, la prochaine fois que vous obtenir l'ouverture d'avertissement, cliquez sur la ligne qui dit "voir la déclaration de 'fopen'". Cela vous mènera à la ligne dans stdio.h qui est l'injection de l'avertissement. Supprimer le texte
_CRT_INSECURE_DEPRECATE(fopen_s)
à partir de cette ligne, et vous ne recevrez plus l'avertissement de sécurité lorsque vous utilisez fopen, mais il restera pour la fonction strcpy, strdup et ceux d'autres éventuellement dangereux.Mouvement de fopen pour fopen_s désactivé la possibilité d'ouvrir le fichier dans le bloc-notes (lecture seule) tandis que le fichier est ouvert et d'être écrit.
Swithing retour de fopen et je peux lire wile mon programme écrit le fichier.
Il suffit de définir
_CRT_SECURE_NO_WARNINGS
avant de vous inclure n'importe quel fichier pour se débarrasser de ce avertissements, et arrêter de croire à ce que MME dit à propos defopen