problème avec fopen_s
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

problème avec fopen_s



  1. #1
    Mind54

    problème avec fopen_s


    ------

    Bonjour quelqu'un pourrait m'indiquer pourquoi lorsque que je mets un chemin d'accès totalement faux dans fopen_s mon programme me renvoit seulement 4.

    Code:
    # include <stdio.h>
    # define NMAX 1000
    
    int Lecture_fichier(FILE*, double[], double[]);
    
    
    int main() {
    	int n;
    	double X[NMAX], Y[NMAX];
    	FILE* pfe = NULL;
    	if ((pfe = fopen_s(&pfe, "Téléchargemensdfsdvsvfvsdvsdts\\rugosite.txt", "r")) == (FILE*)NULL) {
    		printf("Erreur en ouverture du fichier\n");
    		return -1;
    	}
    	printf("%d", 4);
    
    
    }

    -----

  2. #2
    Paraboloide_Hyperbolique

    Re : problème avec fopen_s

    Bonjour,

    fopen_s renvoie un code d'erreur de type errno_t qui retourne 0 si tout se passe bien et non-zéro en cas d'erreur. Dans votre cas, il y a erreur, donc fopen_s retourne une valeur non-nulle qui ne peut être égale à NULL. Donc la condition dans votre if est fausse et votre code affiche la valeur 4 dans le terminal.

    Note: il faudrait normalement un "return 0" à la fin de votre fonction main.

  3. #3
    Mind54

    Re : problème avec fopen_s

    donc si mon fichier s'ouvre correctement je devrais avoir un "Erreur en ouverture du fichier qui s'affiche" ?

  4. #4
    Mind54

    Re : problème avec fopen_s

    Il y a quelque chose en plus qui me pose problème. J'effectue par la suite un fscanf_s comme celui ci:

    fscanf_s(pfe, "%lf%d%lf%lf%lf", &buff, &n, &dx, &buff, &buff);

    mais un message d'erreur s'affiche du type : "Debug assertion failed" avec "Expression: stream != nullptr"

    je suppose que cela vient du fait que pfe=0 dcp je ne vois pas comment faire

  5. A voir en vidéo sur Futura
  6. #5
    Paraboloide_Hyperbolique

    Re : problème avec fopen_s

    En fait cette ligne est fautive.

    Code:
    pfe = fopen_s(&pfe, "Téléchargemensdfsdvsvfvsdvsdts\\rugosite.txt", "r")
    Vous donnez deux rôles à la variable "pfe": celui d'un pointeur sur un "FILE" et celui d'une variable gardant le code d'erreur retourné par la fonction "pfe" (après un cast implicite vers le type pointeur sur "FILE"). La variable "pfe" ne contient donc pas les données relatives au fichier à ouvrir (ou la valeur NULL si le fichier ne peut être ouvert), mais les données relatives au code d'erreur, qui n'est pas un fichier.

    Pour plus de détails sur le fonctionnement de fopen_s, jetez un coup d'oeil là: https://en.cppreference.com/w/c/io/fopen

    Pour le code d'erreur, il vaut mieux déclarer une nouvelle variable et écrire quelque chose comme:

    Code:
    errno_t code_erreur = 0; // 0: pas d'erreur.
    code_erreur = fopen_s(&pfe, "Téléchargemensdfsdvsvfvsdvsdts\\rugosite.txt", "r");
    Ensuite, tester "code_erreur" dans un "if". Si 0: tout va bien et on peut lire le fichier; sinon renvoyer un message d'erreur à l'utilisateur.

  7. #6
    Paraboloide_Hyperbolique

    Re : problème avec fopen_s

    Citation Envoyé par Paraboloide_Hyperbolique Voir le message
    La variable "pfe" ne contient donc pas les données relatives au fichier à ouvrir (ou la valeur NULL si le fichier ne peut être ouvert), mais les données relatives au code d'erreur, qui n'est pas un fichier.
    Petite précision: en fait la variable "pfe" va interpréter le code d'erreur comme une adresse mémoire et pointer vers cette adresse. Pour l'OS, cela constituera probablement une violation d'accès mémoire (la mémoire pointée ayant une bonne probabilité de ne pas être allouée à votre exécutable). En général, cela mènera au plantage de votre exécutable ou à un comportement indéterminé.

  8. #7
    Mind54

    Re : problème avec fopen_s

    merci beaucoup ça marche enfin !!

    j'ai juste une petite question à quoi cela sert-il de mettre "code_erreur=0" ? j'imagine que c'est pour initialiser la variable, mais à quoi cela sert-il ?

  9. #8
    Mind54

    Re : problème avec fopen_s

    Cependant j'ai un encore un autre problème :

    Code:
     
    
    # include <stdio.h>
    # define NMAX 1000
    
    int Lecture_fichier(FILE*, double[], double[]);
    
    
    int main() {
    	int n;
    	double X[NMAX], Y[NMAX];
    	FILE* pfe;
    	errno_t code_erreur ;
    	code_erreur = fopen_s(&pfe, "C:/Users/anton/Downloads/rugosite.txt", "r");
    	if (code_erreur != 0) {
    	     printf("erreur lors de l'ouverture");
    	     return -1;
    	}
    
    		
    	n = Lecture_fichier(pfe, X, Y);
    
    	printf("%d", n);
    
    
    	return 0;
    }
    
    
    
    
    
    
    int Lecture_fichier(FILE* pfe, double X[], double Y[]) {
    	int i = 0, nb_de_points;
    	double dx, buff;
    	fscanf_s(pfe, "%lf%d%lf%lf%lf", &buff, &nb_de_points, &dx, &buff, &buff);
    	while (fscanf_s(pfe, "%lf", &Y[i]) != EOF) {
    	 	X[i] = i * dx;
    	 	i++;
    	}
    	return nb_de_points;
    }

    quand j'éxécute ce programme rien n'apparait dans mon terminal, je pense que le problème vient du fscanf_s

  10. #9
    Mind54

    Re : problème avec fopen_s

    C'est bon j'ai trouvé le problème

  11. #10
    Paraboloide_Hyperbolique

    Re : problème avec fopen_s

    Citation Envoyé par Mind54 Voir le message
    merci beaucoup ça marche enfin !!
    De rien

    Citation Envoyé par Mind54 Voir le message
    j'ai juste une petite question à quoi cela sert-il de mettre "code_erreur=0" ? j'imagine que c'est pour initialiser la variable, mais à quoi cela sert-il ?
    Oui, c'est toujours une bonne pratique d'initialiser une variable avec une valeur par défaut. Ici, ce n'est pas vraiment utile vu la simplicité du code. Cependant, pour des codes plus complexes, cela permet d'éviter un comportement erratique d'un exécutable au cas où l'on emploierais une variable non initialisée*.

    *En C, une variable se voit attribuer un espace mémoire donné. Si elle n'est pas initialisée, celle-ci prend la valeur associée à l'état de cet espace mémoire. Cet espace ayant pu être occupé auparavant par n'importe quel autre exécutable, cet espace est dans un état indéterminé. Donc, si on utilise une variable non-initialisée, il est presque impossible de prévoir le résultat de son traitement.

  12. #11
    Mind54

    Re : problème avec fopen_s

    Très bien merci beaucoup

Discussions similaires

  1. [Energie] Fabrication alim de labo avec ATX psu - Problème avec le relais?
    Par invite987504dc dans le forum Électronique
    Réponses: 2
    Dernier message: 22/12/2019, 15h43
  2. Problème avec google chrome (et avec mon ordinateur en général)
    Par invite3ca6b457 dans le forum Logiciel - Software - Open Source
    Réponses: 7
    Dernier message: 03/02/2013, 18h29
  3. Problème avec Inéquation avec valeur absolue et racine
    Par inviteda7b675e dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 23/09/2011, 19h48
  4. Réponses: 0
    Dernier message: 26/04/2011, 22h25
  5. Réponses: 10
    Dernier message: 22/03/2009, 11h34