Probléme avec les fichiers

Probléme avec les fichiers - C - Programmation

Marsh Posté le 14-04-2009 à 13:20:46    

Voici mon code:

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. FILE* fonction1(FILE *fichier_cos,int N, int M);
  4. int fonction2(FILE* fichier ,int N, int M);
  5. int main(int argc, char *argv[])
  6. {
  7.    FILE *fichier_cos,*f,*fichier_f;
  8.    int N=3,M=3;
  9.    fichier_cos=fopen("fichier_cos.txt","r+" );
  10.    fichier_f=fopen("fichier_f.txt","r+" );
  11.    if(fichier_cos != NULL && fichier_f != NULL )
  12.    {
  13.      
  14.             fichier_cos=fonction1(fichier_cos,N, M);
  15.             f=fonction2(fichier_cos,N,M);
  16.             fprintf(fichier_f,"%d |",f);
  17.    }
  18.    else
  19.    {
  20.       printf("Erreur lors de l'ouveture de fichier" );
  21.    }
  22.     return 0;
  23. }
  24. FILE* fonction1(FILE *fichier_cos,int N, int M)
  25. {
  26.    int i,j;
  27.    for(i=0;i<N;i++)
  28.     {
  29.        for(j=0;j<M;j++)
  30.         {
  31.            fprintf(fichier_cos,"%d",i*j);
  32.             fputs("|",fichier_cos);//separation entre les valeurs
  33.          }
  34.    }
  35.    return fichier_cos;
  36. }
  37. int fonction2(FILE* fichier ,int N, int M)
  38. {
  39.    int i,j,nb=0;
  40.    int recup[255][255];
  41.    for(i=0;i<N ;i++)
  42.    {
  43.       for(j=0;j<M ;j++)
  44.       {
  45.             fscanf(fichier, "%d|",&recup[i][j]);
  46.             printf("%d\t",recup[i][j]);// ici il m'affiche 0
  47.       }
  48.    }
  49.    for(i=0;i<N;i++)
  50.       for(j=0;j<M;j++)
  51.          nb=nb+recup[i][j];
  52.    return nb;
  53. }


j'ai deux fichiers, le premier est: fichier_cos.txt qui contient le produit des indices et l'autre fichier_f.txt qui doit normalament m'afficher l'addition des nombres qui ce trouve dans le premiers fichier (  fichier_cos.txt  ). le Probléme c'est qu'il m'affiche tjr un 0 et je ne sais pas pourquoi !!!


Message édité par man_u le 14-04-2009 à 13:28:41
Reply

Marsh Posté le 14-04-2009 à 13:20:46   

Reply

Marsh Posté le 14-04-2009 à 13:30:56    

1. à quoi sert de retourner des FILE* pour tes fonctions ?

 

2. il manque des fclose()

 

3. essaie de nommer tes fonctions avec des noms parlants, là on est obligé de décortiquer ton code pour comprendre ce qu'il est censé faire

 

4. fscanf(fichier, "%d|",&recup[i][j]); >> tu devrais tester le code retour de fscanf pour vérifier que la lecture a bien été faite.

 


Il doit rester encore plein de choses, j'ai la flemme de poursuivre. :o

 


edit : correction du point 4, j'ai craqué :o


Message édité par Elmoricq le 14-04-2009 à 13:46:34
Reply

Marsh Posté le 14-04-2009 à 13:41:50    

j'ai pas fait des close(), parceque mon programme est encore trop long!
 
Si mon fichier contient: 15 20 30

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.     FILE* fichier = NULL;
  4.     long score[3] = {0}; // Tableau des 3 meilleurs scores
  5.     fichier = fopen("test.txt", "r" );
  6.     if (fichier != NULL)
  7.     {
  8.         fscanf(fichier, "%ld %ld %ld", &score[0], &score[1], &score[2]);
  9.         printf("Les meilleurs scores sont : %ld, %ld et %ld", score[0], score[1], score[2]);
  10.         fclose(fichier);
  11.     }
  12.     return 0;
  13. }


 
ça marche a merveille

Reply

Marsh Posté le 14-04-2009 à 13:44:27    

man_u a écrit :

j'ai pas fait des close(), parceque mon programme est encore trop long!


le rapport avec la choucroute o_O

Reply

Marsh Posté le 14-04-2009 à 13:51:23    

man_u a écrit :

j'ai pas fait des close(), parceque mon programme est encore trop long!

 

Hmm. Ton programme est loin d'être gros. Participe à un projet dont le code pèse plusieurs centaines de milliers de lignes, et on commencera à parler de gros programme. :o
Bref. Tu utilises une ressources (mémoire, flux, fichiers, ce que tu veux), tu dois ensuite libérer cette ressource lorsque tu n'en as plus besoin. C'est un principe de base, qu'il est vital d'appliquer.

 

Pour ton souci, j'ai corrigé mon point 4 où j'ai raconté n'importe quoi, une fois n'est pas coutûme.

 

Ton problème vient de ce que tu lis un fichier dans lequel tu viens d'écrire. Lis la documentation de fopen() :

    When a file is opened with update mode (+ as the  second  or
     third character in the mode argument), both input and output
     may be performed on the associated stream.  However,  output
     must  not be directly followed by input without an interven-
     ing call to fflush(3C) or to a file positioning  function  (
     fseek(3C), fsetpos(3C) or rewind(3C)), and input must not be
     directly followed by output without an intervening call to a
     file   positioning  function,  unless  the  input  operation
     encounters end-of-file.

 


Autre chose :

Code :
  1. fprintf(fichier_f,"%d |",f);


Je ne sais pas ce que tu attends de cette ligne, mais elle a tout lieu de faire planter le programme. Tu es en effet en train de demander à printf d'imprimer un FILE* en le faisant passer pour un int.
Pour imprimer le contenu d'un fichier dans un autre, tu n'as pas d'autre choix que de lire le premier fichier et de le recopier dans le second.

Message cité 2 fois
Message édité par Elmoricq le 14-04-2009 à 13:54:56
Reply

Marsh Posté le 14-04-2009 à 14:02:47    

Elmoricq a écrit :


 
Hmm. Ton programme est loin d'être gros. Participe à un projet dont le code pèse plusieurs centaines de milliers de lignes, et on commencera à parler de gros programme. :o
Bref. Tu utilises une ressources (mémoire, flux, fichiers, ce que tu veux), tu dois ensuite libérer cette ressource lorsque tu n'en as plus besoin. C'est un principe de base, qu'il est vital d'appliquer.
[/fixed]


Je voulais dire il n'est pas encore terminer loool
 
Merci Elmoricq! mais puisque je ne peux pas lire à partir d'un fichier dans lequel je vien d'écrire, alors que j'ai besoin de ces information,que doi-je faire?
 

Code :
  1. fprintf(fichier_f,"%d |",f);//f est un entier entier j'ai fait une erreur dans la déclaration


Message cité 2 fois
Message édité par man_u le 14-04-2009 à 14:07:41
Reply

Marsh Posté le 14-04-2009 à 14:10:52    

Elmoricq a écrit :


Pour imprimer le contenu d'un fichier dans un autre, tu n'as pas d'autre choix que de lire le premier fichier et de le recopier dans le second.


Si je doit recopier le premier fichier dans un autre apres je vais réutiliser ce dernier sa revien en meme non?? (ecriture puis lecture)

Reply

Marsh Posté le 14-04-2009 à 14:11:28    

man_u a écrit :


Merci Elmoricq! mais puisque je ne peux pas lire à partir d'un fichier dans lequel je vien d'écrire, alors que j'ai besoin de ces information,que doi-je faire?


C'est marqué dans l'extrait de la documentation que j'ai mis.

Reply

Marsh Posté le 14-04-2009 à 14:36:29    

man_u a écrit :


Je voulais dire il n'est pas encore terminer loool


C'est encore pire comme justification ! Ca veut dire que tu attends que tu programme soit terminé pour fermer et libérer tes ressources !? Tu as donc plus d'une chance sur deux d'oublier, en fin de compte !
 
Du moment que tu ouvres un fichier, tu testes la valeur de retour de ta fonction d'ouverture du fichier ET tu ajoutes la ligne qui fermera ton fichier. Ensuite, tu peux taper ton code qui se trouve entre l'ouverture et la fermeture. Il faut que ça devienne un réflexe de fermer une ressource. Surtout en C : personne d'autre ne le fera pour toi !


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 14-04-2009 à 14:39:02    

kao98 a écrit :

Surtout en C : personne d'autre ne le fera pour toi !


 
Le système à l'arrêt du programme.
 
Mais ce serait une raison foireuse de ne pas libérer ses ressources (pour tout un tas de bonnes raisons).

Reply

Marsh Posté le 14-04-2009 à 14:39:02   

Reply

Marsh Posté le 14-04-2009 à 14:59:35    

Elmoricq a écrit :


 
Le système à l'arrêt du programme.
 
Mais ce serait une raison foireuse de ne pas libérer ses ressources (pour tout un tas de bonnes raisons).


Ca dépend des systèmes non ?


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 14-04-2009 à 15:04:25    

Ben les systèmes que je connais aujourd'hui le font, mais ma connaissance n'est pas très grande en la matière. Je me souviens des vieux MacOS (avant X) qui ne le faisaient pas, par exemple. [:joce]

Reply

Marsh Posté le 14-04-2009 à 15:07:44    

De toute façon, il FAUT libérer soit même ses ressources.
Le jour où tu fais de l'embarqué, ou un service qui tourne non-stop, t'es bien content d'avoir chopé ces réflexes.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 14-04-2009 à 15:11:22    

kao98 a écrit :


Ca dépend des systèmes non ?


 
Et des ressources.

Reply

Marsh Posté le 14-04-2009 à 15:11:56    

Ah nan mais même sans parler d'embarqué : tu fais un programme appelé à rester un minimum de temps en mémoire, tu peux être sûr que si tu ne chopes pas ce réflexe, tu cours à la catastrophe. Déjà qu'en ayant ce réflexe on en oublie... [:cosmoschtroumpf]

Reply

Sujets relatifs:

Leave a Replay

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