Ma fonction doit-elle retourner un pointeur de fichier ou un entier ?

Ma fonction doit-elle retourner un pointeur de fichier ou un entier ? - C - Programmation

Marsh Posté le 16-05-2008 à 23:51:14    

Salut tout le monde,
je suis en train de développer une petite application qui nécessite de manipuler des fichiers.
 
Pour n'avoir à ouvrir mes fichiers qu'une seule fois, je passe par une fonction "chargement_fichier" qui charge mon fichier dans un pointeur de type FILE et qui retourne 0 ou 1 en fonction de l'ouverture ou non du fichier.
 
Là où je coince un peu, c'est avec la manipulation de mon pointeur fichier.
Etant déclaré en local de ma fonction (FILE *fichier) c'est un pointeur qui pointe vers le contenu de fichier si je ne dis pas de bêtises.
 
Par contre je ne sais pas trop comment le manipuler en dehors de cette fonction.
En effet, mes autres fonctions prennent en paramètre ce fichier (pour ne pas devoir le ré ouvrir à chaque fois).
 
Le problème, c'est que je ne suis déjà pas sûr de comment déclarer l'entête de mes autres fonction.  
Je dois remettre FILE *fichier ? Est-ce que ça va manipuler le même pointeur que celui de ma fonction "chargement_fichier" ?
Lorsque je vais appeler une fonction, l'appel se fera ainsi : ma_fonction(paramètre, &fichier). Je dois donc définir un pointeur de fichier pour appeler ma fonction ?
 
Je ne sais pas si j'ai été très clair, mais ça reste confus pour moi aussi :/
Merci d'avance pour l'aide.
 


---------------
Twitter
Reply

Marsh Posté le 16-05-2008 à 23:51:14   

Reply

Marsh Posté le 17-05-2008 à 00:17:55    

tu peux renvoyer un FILE* créé dans une fonction. Pas de problème pour renvoyer des pointeurs. D'ailleurs c'est ce que fait fopen().

Reply

Marsh Posté le 17-05-2008 à 00:19:52    

koskoz a écrit :

Là où je coince un peu, c'est avec la manipulation de mon pointeur fichier.
Etant déclaré en local de ma fonction (FILE *fichier) c'est un pointeur qui pointe vers le contenu de fichier si je ne dis pas de bêtises.


C'est un pointeur vers une structure qui décrit le fichier et qui est utilisée par les fonctions comme fopen() et fclose() pour le manipuler.
 

koskoz a écrit :

Le problème, c'est que je ne suis déjà pas sûr de comment déclarer l'entête de mes autres fonction.  
Je dois remettre FILE *fichier ? Est-ce que ça va manipuler le même pointeur que celui de ma fonction "chargement_fichier" ?
Lorsque je vais appeler une fonction, l'appel se fera ainsi : ma_fonction(paramètre, &fichier). Je dois donc définir un pointeur de fichier pour appeler ma fonction ?


Ta fonction retournera l'adresse d'une structure FILE donc tant que l'adresse sera valide (jusqu'au fclose()) il n'y aura pas de problème. C'est avec les variables locales qu'il faut faire attention, elles ne sont plus utilisables en dehors du bloc où elles ont été définies.
Par exemple ce code a l'air de fonctionner :

Code :
  1. #include <stdio.h>
  2. FILE* chargement_fichier (char const *nom);
  3. void faire_des_trucs_sur_le_fichier (FILE *p_fichier);
  4. int main (void)
  5. {
  6.    FILE *p_fichier = chargement_fichier ("essai.txt" );
  7.  
  8.    if (p_fichier != NULL)
  9.    {
  10.       faire_des_trucs_sur_le_fichier (p_fichier);
  11.       fclose (p_fichier);
  12.    }
  13.    return 0;
  14. }
  15. FILE *chargement_fichier (char const *nom)
  16. {
  17.    return fopen (nom, "w" );
  18. }
  19. void faire_des_trucs_sur_le_fichier (FILE *p_fichier)
  20. {
  21.    fputs ("test\n", p_fichier);
  22. }


---------------
dap.developpez.com
Reply

Marsh Posté le 17-05-2008 à 09:03:31    

Je ne vois pas trop l'intérêt de la fonction FILE *chargement_fichier (char const *nom) ?!

Reply

Marsh Posté le 17-05-2008 à 10:32:08    

bah si elle fait juste que fopen c'est sur

Reply

Marsh Posté le 17-05-2008 à 11:49:34    

C'est pas mieux d'ouvrir le fichier une seule fois pour toute ?
D'après vous, si je l'ouvre une fois par fonction ça n'a pas d'importances ?


---------------
Twitter
Reply

Marsh Posté le 17-05-2008 à 13:50:25    

oui c'est idiot

Reply

Marsh Posté le 17-05-2008 à 14:03:10    

Idiot de l'ouvrir plusieurs fois ou de l'ouvrir qu'une seule fois.


---------------
Twitter
Reply

Marsh Posté le 17-05-2008 à 20:57:30    

Ça dépend de l'utilisation du fichier, est-ce uniquement un fichier qui contient des données destinées à être lues ou autre chose, est-il mis à jour régulièrement ?  
Quelles sont les conséquences s'il y a un crash et que les données sont endommagées.

Reply

Marsh Posté le 17-05-2008 à 21:03:53    

Le fichier est destiné à être lu pour stocker ses données dans un tableau, c'est tout.
C'était juste pour éviter la redondance de code.


---------------
Twitter
Reply

Marsh Posté le 17-05-2008 à 21:03:53   

Reply

Marsh Posté le 18-05-2008 à 11:00:02    

Dans ce cas tu peux le garder ouvert et trimballer ta variable au gré des fonctions du programme (les variables globales c'est pas beau, mis dans ce cas précis, ça pourrait être envisagé !)

Reply

Marsh Posté le 19-05-2008 à 12:51:18    

Et si le fichier ne s'ouvre pas, je retourne quoi ?


---------------
Twitter
Reply

Marsh Posté le 19-05-2008 à 13:09:19    

Ta fonction retourne NULL (enfin le fopen), à toi de traiter ce cas dans ton programme.

Reply

Marsh Posté le 19-05-2008 à 13:23:38    

Oui, ça je sais, mais comme ma fonction retourne un pointeur de fichier, en cas de non ouverture de fichier je ne sais pas ce qu'elle doit retourner vu que NULL n'est pas accepté.


---------------
Twitter
Reply

Marsh Posté le 19-05-2008 à 15:45:37    

En se basant sur ceci

Code :
  1. FILE *chargement_fichier (char const *nom)
  2. {
  3.    return fopen (nom, "w" );
  4. }

ta fonction retourne NULL non ?
Je ne comprends pas exactement ce que tu veux dire par  

Citation :

en cas de non ouverture de fichier je ne sais pas ce qu'elle doit retourner vu que NULL n'est pas accepté.


Au fait

Citation :

Le fichier est destiné à être lu pour stocker ses données dans un tableau, c'est tout.

Le fichier doit être lu et tu l'ouvres en écriture ???


Message édité par Trap D le 19-05-2008 à 15:47:35
Reply

Marsh Posté le 19-05-2008 à 15:53:34    

C'est pas mon code, c'est celui de dap.
 
Enfin après reflexion, ma fonction sert à rien vu que si je fais bien les choses, je ne devrai ouvrir le fichier qu'une seule fois.


---------------
Twitter
Reply

Marsh Posté le 19-05-2008 à 16:18:41    

Une fonction chargement_fichier d'1 ligne qui ne charge pas le fichier, mais l'ouvre en écriture/troncature, c'est un très bon nom.

Reply

Marsh Posté le 19-05-2008 à 17:51:18    

Je sais pas trop de quoi tu parles vu que je n'ai donné aucun bout de code.


---------------
Twitter
Reply

Marsh Posté le 24-05-2008 à 18:28:11    

Il parle du code proposé par Dap++


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 24-05-2008 à 18:55:55    

C'était pour montrer un exemple de fonction qui retourne un FILE* à partir de ce que koskoz avait dit sur son problème, après il en fait ce qu'il veut. :)


---------------
dap.developpez.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed