web-dev-qa-db-fra.com

Comment passer de fopen à fopen_s

Visual Studio se plaint de fopen. Je ne trouve pas la syntaxe appropriée pour la changer. J'ai:

FILE *filepoint = (fopen(fileName, "r"));

à

FILE *filepoint = (fopen_s(&,fileName, "r"));

Quel est le reste du premier paramètre?

13
beatleman

fopen_s est une variante "sécurisée" de fopen avec quelques options supplémentaires pour la chaîne de mode et une méthode différente pour renvoyer le flux pointeur et le code d'erreur. Il a été inventé par Microsoft et a fait son chemin dans la norme C: il est documenté dans l'annexe K.3.5.2.2 du projet le plus récent de la norme C11. Bien sûr, il est entièrement documenté dans l'aide en ligne de Microsoft. Vous ne semblez pas comprendre le concept de passer un pointeur vers une variable de sortie en C. Dans votre exemple, vous devez passer l'adresse de filepoint comme premier argument:

errno_t err = fopen_s(&filepoint, fileName, "r");

Voici un exemple complet:

#include <errno.h>
#include <stdio.h>
#include <string.h>
...
FILE *filepoint;
errno_t err;

if ((err = fopen_s(&filepoint, fileName, "r")) != 0) {
    // File could not be opened. filepoint was set to NULL
    // error code is returned in err.
    // error message can be retrieved with strerror(err);
    fprintf(stderr, "cannot open file '%s': %s\n",
            fileName, strerror(err));
    // If your environment insists on using so called secure
    // functions, use this instead:
    char buf[strerrorlen_s(err) + 1];
    strerror_s(buf, sizeof buf, err);
    fprintf_s(stderr, "cannot open file '%s': %s\n",
              fileName, buf);
} else {
    // File was opened, filepoint can be used to read the stream.
}

Le support de Microsoft pour C99 est maladroit et incomplet. Visual Studio génère des avertissements pour le code valide, forçant l'utilisation d'extensions standard mais facultatives mais dans ce cas particulier ne semble pas prendre en charge strerrorlen_s. Reportez-vous à Fonction strerrorlen_s C11 manquante sous MSVC 2017 pour plus d'informations.

25
chqrlie