Pb de chargement d'un fichier txt dans un tableau

malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010 - 5 août 2009 à 16:05
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010 - 5 août 2009 à 21:18
Bonjour,
j'ai un problème bloquant dans mon projet et j'ai désespérement besoin d'un coup de main
j'ai fait un traitement sur un fichier de base pour retirer des elements qui m'interessent que j'ai mis dans un autre fichier txt en sortie appelé f.
le fichier f se présente comme suit
value position
132879 239
129838 495
119677 748
124528 1004
129679 1259
118786 1516
106028 1519
110390 1521
107297 1525
106501 1527
131993 1531
131886 1533
132069 1535
133263 1537
122166 1770
119731 2025
121256 2027
111250 2029
107753 2031
113319 2033
113187 2035
109311 2037
113094 2040
122961 2044
113557 2048
113885 2052
112427 2057
113695 2060
114689 2064
126138 2068
112124 2072
112572 2076
112929 2080

je voulais maintenant reprendre le fichier de sortie f en lecture pour effectuer d'autres traitements sur ces valeurs
j'ai donc

sprintf((char *) &filename,"fic2_res.txt");
f = fopen(filename,"w+"); 
// compt est le nombre de lignes dans mon fichier f qui a été écrit auparavant
// tab1 et tab2 sont 2 tableaux qui recupère respectivement la 1ère colonne et la 2nde colonne de mon fichier 
for (k=1;k<compt;k++)
    { 
      fscanf (f,"%d %d\n", &tab1[k], &tab2[k]);
      printf ("%d %d\n", tab1[k], tab2[k]);   
         
         }   

Mon problème est que à l'affichage,
je n'ai pas les premières valeurs et j'ai par exemple pour la ligne en rouge
961 044

je ne comprends vraiment pas le pb
mon indice k, compt est déclaré en long
j'écris et je veux lire mon fichier f dans la même fonction ;

Merci si vous y comprenez quelque chose

6 réponses

gaoul78990 Messages postés 2 Date d'inscription mercredi 22 avril 2009 Statut Membre Dernière intervention 5 août 2009
5 août 2009 à 17:14
bonjour,
quel est le type de tes tableaux? s'il sont déclarés en tant que int le pb vient peut etre de la (val > 65535)et qu'il faudrait déclarer des long et changer ton code:

fscanf (f,"%ld %ld\n", &tab1[k], &tab2[k]);
printf ("%ld %ld\n", tab1[k], tab2[k]);
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
5 août 2009 à 17:16
je pense que le problème est que je ne fais pas la lecture en début de mon fichier (qui vient à peine d'être créé en écriture)
sauriez-vous comment faire pour lire en début de mon fichier et récupérer les valeurs dans les deux tableaux ( sans la première ligne qui correspond au message )
je vous remercie d'avance pour vos réponses
0
gaoul78990 Messages postés 2 Date d'inscription mercredi 22 avril 2009 Statut Membre Dernière intervention 5 août 2009
5 août 2009 à 17:48
    int d,k,compt=20;
    long int tab1[500],tab2[500];
    FILE* f;
    f = fopen("test.txt","r+");
    char chaine[100];
    fscanf (f,"%s\n",chaine);
    for (k=0;k<compt;k++)

    { 

      fscanf (f,"%ld %ld\n", &tab1[k], &tab2[k]);

      printf ("%ld %ld\n", tab1[k], tab2[k]);   

         

   } 


En espérant avoir fait avancé le shmilblik
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
5 août 2009 à 19:12
excuses moi je viens de voir ton message.
Mes tableaux sont bien des Long
et f est à la base un fichier qui est créé en écriture ( vu que c'est le resultat d'un premier traitement )
ensuite j'utilise le f en lecture , c'est pourquoi je l'ai déclaré en w+
pas de changement pour ton id mais merci bcp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
5 août 2009 à 19:38
Salut,
Est-ce que tu ne peux pas stocker dans le tableau les valeurs lorsque tu les "retire du fichier de base" ? Plutôt que mémoire -> disque -> mémoire, essaie le mémoire -> mémoire, plus simple et plus rapide (ce qui n'empêche pas de sauvegarder les données dans un fichier si tu en as un autre usage).

Avec un int (32 bits en général), on peut compter jusqu'à plus de 2 milliards, ce qui est largement suffisant pour stocker 122961.

Ça :
sprintf((char *) &filename,"fic2_res.txt");
n'a pas d'intérêt.

fscanf, entre autres, renvoie une valeur (int fscanf(...)) ; c'est dommage de ne pas la regarder.

Bonne prog,
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
5 août 2009 à 21:18
slt Chouchou182,
finalement, je mets mes valeurs dans un tableau et j'effectue d'autres traitements.
je voudrais tester la colonne des positions
si les positions se suivent ( de 2, 3 ou 4 ) alors on conserve que la value la plus élevée de toutes les valeurs

exp: les valeurs en rouge ont des positions qui se suivent

value position
132879 239
129838 495
119677 748
124528 1004
129679 1259
118786 1516
106028 1519
110390 1521
107297 1525
106501 1527
131993 1531
131886 1533
132069 1535
133263 1537

donc dans mon fichier de sortie , je dois avoir
value position
132879 239
129838 495
119677 748
124528 1004
129679 1259
133263 1537

si vous avez des idées

j'ai fait cet algo mais c'est pas terrible
for (k=1;k<compt;k++) 
     {if ((tab2[k+1]== tab2[k]+2) ||(tab2[k+1]== tab2[k]+3)|| (tab2[k+1]== tab2[k]+4))
        {   if (tab1[k+1]>tab1[k])
                    {if (f) fprintf (f,"%d %d\n",tab1[k+1], tab2[k+2]); 
                    else fprintf(stderr,"Erreur : ne peut pas ouvrir %s\n",filename);
                    }
         }           
       else         
          {if (f) fprintf (f,"%d %d\n",tab1[k], tab2[k]); 
                    else fprintf(stderr,"Erreur : ne peut pas ouvrir %s\n",filename);
          }        
     }


merci
0
Rejoignez-nous