C/C++ fonction fopen
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

C/C++ fonction fopen



  1. #1
    cosmoff

    C/C++ fonction fopen


    ------

    Bonjour à tous,

    je viens de voir les pointeurs et je suis confronté à une fonction que j'ai du mal à comprendre :

    Code:
    FILE* fopen(const char* nomDuFichier, const char* modeOuverture);
    si je comprend bien, la fonction retourne un pointeur de type fichier. Il faut donc que je lui donne un pointeur, j'ai donc fait :

    Code:
    FILE *fichier = NULL;
    *fichier = fopen(...)
    mais il faut mettre
    Code:
    fichier = fopen(...)
    et je ne comprend pas pourquoi.

    pouvez vous éclaircir mon problème sur ce point là
    Merci d'avance

    -----

  2. #2
    pm42

    Re : C/C++ fonction fopen

    Tu déclares une variable de type pointeur, FILE* et fopen renvoie un pointeur...
    Donc tu alloues un pointeur dans un autre. C'est logique.

    En fait, l'idée est que FILE est un type "opaque", tu n'as pas besoin de connaitre son contenu, juste de le récupérer et de le passer à d'autres méthodes qui en fonction de l'implémentation vont savoir ce qu'il faut en faire.
    Donc fopen l'alloue pour toi, remplit les champs que tu ne connais pas.
    Et fclose va libérer la mêmoire.

  3. #3
    albanxiii
    Modérateur

    Re : C/C++ fonction fopen

    Bonjour,

    Un truc qui peut être utile, mais les pros corrigerons si ce que je propose n'est pas une bonne méthode (j'ai écrit beaucoup plus de VHDL que de C dans ma vie...).

    "FILE *f; "déclare un pointeur f sur le type FILE. Mais on peut aussi voir "*f" comme une variable de type FILE (puisque *f désigne l'objet pointé par f).

    Donc, comme le prototype FILE* fopen(const char* nomDuFichier, const char* modeOuverture); indique que fopen renvoie un type FILE *, donc un pointeur sur le type FILE, c'est bien f = fopen(...); qu'il faut écrire.

    @+
    Not only is it not right, it's not even wrong!

  4. #4
    lou_ibmix_xi

    Re : C/C++ fonction fopen

    Comme tout le monde l'a déjà expliqué, c'est juste de la syntaxe (qui malheureusement n'est pas très bien choisie):
    Code:
    type x;
    type * ptr; // déclaration de ptr pointeur sur type
    x = *ptr; // on copie dans x le contenu pointé par ptr
    ptr = &x; // ptr pointe vers x
    deux remarques:
    le * de la déclaration (pointeur de type) n'est pas le même que le * du déréférencement (contenu du pointeur), donc ton code doit être:
    Code:
    FILE * fichier = NULL;
    fichier = fopen(...);
    que tu peux donc raccourcir en
    Code:
    FILE * fichier = fopen(...);
    Dans mon exemple de code, "x = *ptr" implique que ptr soit alloué (pointe vers quelque chose qui existe), donc retourné par un malloc ou autre fopen, ou si tu as déjà copié l'adresse d'une case qui existe comme dans la ligne "ptr = &x;"

    Si tu veux faire un peu de C, je pense que tu devrais investir dans le K&R (la 2ème édition absolument), qu'on doit trouver assez facilement d'occaz sur le net.

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

    Cool Re : C/C++ fonction fopen

    Ici la fonction fopen retourne un pointeur de structure !

    Quand tu fait :

    FILE* ma_structure = NULL; // tu déclare un pointeur de structure initiliser a NULL

    Le prototype de fopen est comme ce-ci FILE* fopen(const char*, const char* );
    Son type de retour est bien FILE* !

    Donc pour utiliser cette fonction il te faut recuperer le type de retour dans une variable de même type ! Mais oui jamy c'est logique ! Quand ta une fonction qui retourne un int tu va pas mettre la valeur de retour dans une double ou un float !

    Ici c'est parreil !

    Je te résume sa d'un petit programme que j'ai fait :
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct 
    {
    	int a;
    }Age;
    
    Age* fonction(int a);
    
    int main(void)
    {
    	Age* pt = NULL;
    	
    	pt = fonction(10);
    	
    	printf("%d\n", pt->a);
    	
    	
    	free(pt);
    	
    	return 0;
    }
    
    Age* fonction(int a)
    {
    	Age* age;
    	age = malloc(sizeof(age));
    	
    	if(age == NULL)
    	{
    		fprintf(stderr, "Memoire inssufisante !");
    	}
    	
    	age->a = a;
    	return age;
    }
    Dernière modification par Jack ; 24/01/2017 à 14h16. Motif: Ajout balises code

  7. #6
    pm42

    Re : C/C++ fonction fopen

    Pas de bonjour, tu explique ce qui a déjà été expliqué plusieurs fois, tu postes un programme qui n'apporte rien sans le formatter...

    Bienvenue sur le forum. Lire la charte avant de poster serait une bonne idée

  8. #7
    Jack
    Modérateur

    Re : C/C++ fonction fopen

    Pour notre nouveau participant qui voulait sûrement bien faire, il est nécessaire de lire les règles participatives avant de poster.
    Dernière modification par Jack ; 25/01/2017 à 06h55.

  9. #8
    lou_ibmix_xi

    Re : C/C++ fonction fopen

    Au fait, je n'avais pas relevé mais fopen etc c'est la bibliothèque standard C, il vaut mieux utiliser les iostream en C++.

  10. #9
    pm42

    Re : C/C++ fonction fopen

    Citation Envoyé par lou_ibmix_xi Voir le message
    Au fait, je n'avais pas relevé mais fopen etc c'est la bibliothèque standard C, il vaut mieux utiliser les iostream en C++.
    D'un autre coté, il n'a pas précisé s'il faisait du C ou du C++.
    Note que je ne suis pas fan des iostream, je trouve l'interface un peu lourde.

  11. #10
    lou_ibmix_xi

    Re : C/C++ fonction fopen

    Citation Envoyé par pm42 Voir le message
    D'un autre coté, il n'a pas précisé s'il faisait du C ou du C++.
    Note que je ne suis pas fan des iostream, je trouve l'interface un peu lourde.
    C'est dans le titre, c'est pour ça que ça m'avait également échappé au début...

  12. #11
    pm42

    Re : C/C++ fonction fopen

    Citation Envoyé par lou_ibmix_xi Voir le message
    C'est dans le titre, c'est pour ça que ça m'avait également échappé au début...
    En effet. Bien vu.
    De toute manière, il n'est pas encore revenu pour commenter les réponses.

Discussions similaires

  1. différence en langage C entre open et fopen
    Par cosmoff dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 13/12/2015, 12h40
  2. fopen avec pic32 ethernet starter kit
    Par G38 dans le forum Électronique
    Réponses: 11
    Dernier message: 05/05/2015, 08h36
  3. Eviter les répétitions de : fopen
    Par AmigaOS dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 09/08/2012, 00h54
  4. probleme avec fopen()
    Par invitec4114293 dans le forum Programmation et langages, Algorithmique
    Réponses: 11
    Dernier message: 23/01/2011, 19h04
  5. Comment insérer une fonction Matlab dans les paramètres d'entrée d'une autre fonction ??
    Par inviteac36b108 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 04/01/2010, 07h16