Ouverture d'un gros fichier txt ( taille > 3Mo)

malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010 - 3 août 2009 à 16:01
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010 - 4 août 2009 à 10:24
Bonjour,

J'ai a traité des fichiers txt de valeurs dont je ne connais pas le nombre d'elements mais qui font plus de 3Mo.
J'ai essayé la fonction fread avec ce code pour allouer suffisamment d'espace pour ouvrir mon fichier txt:
fp = fopen("C:\\projet C\\fic1.txt","r");
// deplace le curseur a la fin
fseek(fp,0,SEEK_END);
// taille du fichier
long sizeFile=ftell(fp);
// on se repositionne au debut
fseek(fp,0,SEEK_SET);
// allocation
char * buffer=(char*)malloc(sizeFile+1);
// lecture
fread(buffer,2,sizeFile,fp);

mais rien, je n'arrive toujours pas à l'ouvrir
je signale que mon fichier ne contient qu'une seule colonne de valeur décimale ( float) .

Je voudrais recupérer ces valeurs dans un tableau afin d'effectuer des traitements la dessus.

pour un plus petit fichier ouvert en lecture
j'ai utilisé :
while (!feof(fp))
{
fscanf (fp, "%f", &internal_table[i]);

i++;
}
çà marche bien mais là , je sèche un peu


Merci à ceux qui pourront m'aider à me sortir de ce problème

12 réponses

fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 août 2009 à 16:55
Utilise les balises "code" ca rend ton messages plus clair.

Je ne vois pas ton souci, j'ai déjà ouvert des fichiers de plus de 100Mo avec fopen. Ca veut dire quoi : "mais rien, je n'arrive toujours pas à l'ouvrir ", fp == NULL ?
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
3 août 2009 à 17:15
desolé si je n'ai pas utilisé les balises codes

oui j'ai le message fp== null car j'ai programmé un message d'erreur

fp = fopen("C:\\projet C\\ fic2.txt","r"); 
if(fp == NULL){
      printf("Impossible d'ouvrir le fichier %s\n", fp);   system("pause");
      exit(-1);
  }


mon problème est que le fichier existe bien, j'ai crée un autre fichier de plus petite taille et il n'y pas de problème , j'arrive bien à l'ouvrir et à récupérer les données avec
while (!feof(fp)) 
{ 
fscanf (fp, "%f", &internal_table[i]); 

i++; 
} 


et donc j'ai pensé que le problème est lié à la taille de mon fichier , d'ou l'utilisation de
fp = fopen("C:\\projet C\\ fic2.txt","r"); 
if(fp == NULL){
      printf("Impossible d'ouvrir le fichier %s\n", fp);   system("pause");
      exit(-1);
      }
// deplace le curseur a la fin 
fseek(fp,0,SEEK_END); 
// taille du fichier 
long sizeFile=ftell(fp); 
// on se repositionne au debut 
fseek(fp,0,SEEK_SET); 
// allocation 
char * buffer=(char*)malloc(sizeFile+1); 
// lecture 
fread(buffer,2,sizeFile,fp); 


mais là aussi, j'ai le message NULL
je te promets que l'emplacement de mon fichier est le bon et le nom aussi.

Merci si tu as une explication
0
iloveprog Messages postés 16 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 4 novembre 2009
3 août 2009 à 19:22
heu, le nom de ton fichier commence par un espace?
parce que la tu as :
fp = fopen("C:\\projet C\\ fic2.txt","r");
peut-être juste une erreur d'etourderie... :D
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
3 août 2009 à 19:47
Salut malouve.

Tout d’abord, il y a une espace dans le nom de fichier " fic2.txt" ; est-ce bien voulu ?

Sinon, en cas d’erreur, fopen renvoie NULL et renseigne la variable errno. As-tu pensé à regarder de ce côté-ci ? par exemple en faisant appel à la fonction perror.

Enfin il me semble que tu devrais te dispenser de fseek. Dans unistd.h il y a une fonction nommée filelength. Je suppose que l’API Windows est aussi bien équipée.

Bonne prog,
0

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

Posez votre question
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
3 août 2009 à 20:00
merci pour vos réponses
mais dans mon code, je n'ai pas d'espace, je viens encore de vérifier chemin et syntaxe mais non, je n'arrive pas à ouvrir
j'ai toujours impossible d'ouvrir le fichier
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
3 août 2009 à 20:05
Et que dit perror ?
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
3 août 2009 à 20:19
je cherche la syntaxe avec perror sur le net car je ne connaissais pas cette fonction, je suis debudante en C
avec perl penses-tu que peux faire des analyses de fichiers txt, je recherche dans mon fichier des valeurs particulières qui me donnent des tracés spéciaux?
serait-ce possible de faire un genre de détecteur en PERL?
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
3 août 2009 à 21:26
une erreur stupide de ma part, je viens de voir que l'extension n'est pas .txt mais .log
merci à tous et a chouchou182, ma question demeure
j'ai testé le perror et c'est comme çà que je me suis rendue compte
merci à tous
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
3 août 2009 à 21:34
Salut,
D'abord, désolé pour la fausse information concernant filelength. Alors voici un exemple d'utilisation de perror et fstat, cette-dernière n'étant disponible que pour certains systèmes (SVr4, 4.3BSD et POSIX.1-2001, dixit man).
#include<stdio.h>
#include<sys/stat.h>

int
main()
{
  FILE *fp;
  struct stat st;

  fp = fopen(__FILE__,"r");
  if (fp == NULL)
    {
      perror("fopen");
      return 1;
    }

  if (fstat(fileno(fp), &st) != 0)
    {
      perror("fstat");
    }
  else
    {
      printf("Taille du fichier: %ld octets\n", st.st_size);
    }

  fclose(fp);

  return 0;
}


Ensuite, concernant le choix du langage...
Si le critère permettant de décider si une valeur est particulière ou non peut être décrit par une expression régulière, alors c'est une ligne de AWK!
L'expression "me donnent des tracés spéciaux" n'est pas très explicite; si tu peux la détailler un peu, cela pourrait aider. Il existe peut-être des outils plus adéquats que le langage C qui reste de très bas niveau (mais ça peut s'avérer rigolo, si c'est ce qui est recherché).

Bonne prog,
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
3 août 2009 à 22:22
merci chouchou182 pour la syntaxe de PERROR.
Mon fichier txt contient ds valeurs qui lorsqu'on fait des graphiques sous excel , montrent des pics. Le nombre de pics permet de déduire certaines choses ( je ne peux pas tout détailler vu le caractère confidentiel de mes données) . Au lieu de compteer le nombre de pics à la fin, je fais un exe qui lorsque lancer permet de compter le nombre de pics et me donne le resultat voulu suivant le nombre de pics obtenus, le pb est que je peux avoir des pics consecutifs dans ce cas il faut que je prenne la plu grande des valeurs comme le seul pic ( c'est comme si j'avais du bruit autour d'un pic)
je donne un exemple , voilà des pics et leur position que j'obtiens , pour les 2 premières valeurs au lieu des 2 , vu que ce sont des positions successives , je ne prendrai que
la valeur en rouge car c'est la plus grande .
des fois on est pas limité à 2 valeurs mais à plusieurs ayant des incréments de 1 ou 2.
c'est un des points que je dois terminer au plus tot mais sincèrement , je ne vois pas encore comment faire en C.
value :97488 position :237
value :132879 position :238value :76889 position :493
value :129838 position :494
value :69829 position :746
value :119677 position :747
value :124528 position :1003
value :129679 position :1258

value :95262 position :1514
value :118786 position :1515
value :106028 position :1518
value :110390 position :1520
value :106903 position :1523
value :107297 position :1524
value :106501 position :1526
value :110370 position :1528
[color=red]value :129917 position :1529value :131993 position :1530/color


si vous avez des idées, je suis preneur


Merci
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
4 août 2009 à 01:27
Salut,
Excel ? passons...
Si j'ai bien compris, il s'agit de trouver, dans une séquence de nombres positifs, les maxima locaux et leur position.
Je ne suis pas sûr pour l'histoire du bruit. Prenons par exemple la séquence suivante :
0, 10, 100, 99, 101, 99, 100, 10
Combien de valeurs faut-il isoler ? Une (101 à la cinquième position) ou trois (100, 101 et 100, aux troisième, cinquième et septième positions respectivement) ?
Dans le premier cas, quelle est la largeur minimale d'un pic ? En d'autres termes, quelle est la largeur de la fenêtre à travers laquelle on regarde les données ?
L'idée est de faire glisser la fenêtre le long des données et de rechercher un maximum global dans la fenêtre (ouverte).

Après ce pitoyable jeu de mot, voici un exemple de script (awk) qui recherche tous les maxima locaux. Ça a l'avantage d'être concis sans être encombré de manipulation de fichiers et d'allocation de mémoire.
BEGIN { d1 prec cpt = 0 }

! /^[:blank:]*$/ {
  d = $1 - prec
  if (d1 >= 0 && d < 0)
    print cpt, prec
  d1 = d
  prec = $1
  ++cpt
}

END {
  if (d1 >= 0)
    print cpt, prec
}


Le principe est le suivant : on se souvient de la dernière valeur étudiée et de la dernière variation. Si la variation change de signe, alors on a franchi un extremum (que l'on affiche).

Est-ce que cela semble une piste à suivre ?
0
malouve Messages postés 56 Date d'inscription mardi 5 juin 2007 Statut Membre Dernière intervention 20 juillet 2010
4 août 2009 à 10:24
salut Chouchou182, je viens de voir ton message , tu as compris que c'est une recherche locale de maxima , j'ai fait un code identique à celui que tu m'as présenté mais en C
value XXX position YYY vient du resultat de la fonction recherchant des max locaux.
pour répondre à ta question c'est bien 100,101,100.
J'aimerais plutot resté en C vu que j'ai commencé comme çà et je dois rendre un résultat au plus tot. Pour ma culture personnelle, je ferai l'exercice en Perl
Mon fichier présente plus 300000 lignes et je dois faire mes recherches tous les 12000 points, localement je devrais trouver 47 pics ( sur les 12000 points) mais je peux obtenir beaucoup plus vu que je recupère mes pics par rapport à un seuil de 50000.
lorsque j'ai des valeurs:
21;95;118;109;104;106;103;110;93;90;106;107
mettons un seuil à 50
je recupère les valeurs:
95;118;106;110;106;107
95 et 118 se suivent mais je veux plus tot 118 aulieu des 2
voilà le code utilisé
for (i=1;i<n;i++) 
     {
         if ((*table_ptr>min_level) && ( *table_ptr>former_value) // si je mets une 3ème condition ici, je ne recupère plus rien )
         {   // if (*table_ptr++>*table_ptr) 
            
            peak_amount++;
            peak_position [peak_amount] = i;
             
            if (f) fprintf (f,"value :%d position :%d\n", *table_ptr++ ,peak_position [peak_amount]); 
            else fprintf(stderr,"Erreur : ne peut pas ouvrir %s\n",filename);
           
           // system("pause");
         }   
         former_value = *table_ptr;
         *table_ptr++;  
     }


les comparaisons de valeurs doivent se faire entre les valeurs précédentes et les suivantes

Merci encore aux personnes qui pourraient m'aider à progresser
0
Rejoignez-nous