Lecture fichiers

Signaler
Messages postés
9
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2004
-
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005
-
Bonjour,
J'ai fait un programme qui genere un fichier texte, dans le quel se trouve la date et la temperature:

exemple:

20/12/2004 -- 15:44:12 18.60
20/12/2004 -- 15:44:22 13.40
20/12/2004 -- 15:44:32 19.00
20/12/2004 -- 15:44:42 7.60
20/12/2004 -- 15:44:52 12.40
20/12/2004 -- 15:45:02 15.00
20/12/2004 -- 15:45:12 32.60
20/12/2004 -- 15:45:22 17.80
20/12/2004 -- 15:45:32 31.60
20/12/2004 -- 15:45:42 32.60
20/12/2004 -- 15:45:52 16.60
20/12/2004 -- 15:46:02 14.60
20/12/2004 -- 15:46:12 12.80
20/12/2004 -- 15:46:22 4.00
20/12/2004 -- 15:47:38 22.20
20/12/2004 -- 15:47:48 22.60
20/12/2004 -- 15:47:58 17.20
20/12/2004 -- 15:48:08 24.20
20/12/2004 -- 15:48:18 33.20
20/12/2004 -- 15:48:28 22.80
20/12/2004 -- 15:48:38 30.20
20/12/2004 -- 15:48:48 31.00
20/12/2004 -- 15:48:58 18.00
20/12/2004 -- 15:49:08 11.40
20/12/2004 -- 15:49:18 27.80
20/12/2004 -- 15:49:28 18.20
20/12/2004 -- 15:49:38 8.40
20/12/2004 -- 15:49:48 17.00

Maintenant je voudrai réaliser un programme qui analyse le fichier et m'affiche la température max et min avec l'heure de l'échantillion.

S'il y a quelle que chose de pas clair signalé le moi.
Merci d'avance.

KRIS 83

10 réponses

Messages postés
6
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
21 décembre 2004

Voila le genre de programme pour lire n'importe quel fichier :
Après il te faut analyser les données que ca te sort ( caractere par caracter ou alors anrrange toi lorsque tu lis pour droit prendre tte une ligne)
#include <stdio.h>
#include <conio.h>
#include <math.h>

//Lecture fichier fichier quelquonque

const int hysterese=1;

void main ()
{
FILE *fichier;
unsigned char valeur; // 8bits non signés !
int cpt=0;
long taille_fichier=0;

if((fichier = fopen("C:\\Reconnaissance\\test.txt", "r"))!=0) //Ouvrir le fichier
{

fseek(fichier,0, SEEK_END); //Pointer la fin du fichier

taille_fichier = ftell(fichier); //Regarder la taille du fichier

fseek(fichier,0, SEEK_SET); //Replacer le poinzeur au début du fichier

for(cpt=0;cpt<=taille_fichier;cpt++) //Analyser toutes les données du fichiers
{
fseek(fichier,cpt, SEEK_SET); //Pointer précisèment la valeur

fread(&valeur, 1, 1, fichier); //on range la valeur 8bit dans valeur

printf("%d : %d \n",cpt,valeur);

}

fclose(fichier);
}
else
{
printf("Erreur, impossible d'ouvrir le fichier");
}

getch();
}
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

"S'il y a quelle que chose de pas clair signalé le moi."
oui, C ou C++ ?
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

Si tu as fait le pgm qui genere ce fichier texte, il te sera facile d'y apporter quelques modifications pour rendre les enregistrements de longueur fixe. Je m'explique : la partie temperature est de longueur variable comprenant au moins 3 digits (0.0) et pouvant aller jusqu'a 7 digits (-273.00) je te conseille de formater cette information differemment pour obtenir une forme fixe du type +999.99.
Dans ce cas il est alors possible de lire chaque record dans un structure avec un fread() et d'extraire le dernier champs puis de le convertir en float avec les functions appropriees.
Yves
Messages postés
9
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2004

Merci pour vos réponses.
Pour répondre a la question de "plus_plus_fab" je programme en C.
Enfaite je voudrais savoir comment "deplacer mon curseur" juste sur la temprérature é lire que cette données. Et evidement de meme pour la date. Ya t'il un moyen pour avancer de temps de caracteres??? ou autre choses ???

Pour Nashua je ne vois pas tout a fait ce que tu veux que je modfie, je te met ma source si ca peut aider:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

float temperature(void);
void Getdate(char);
void saisi(char);
void wait(int);

int Getdate(char Date[])
{
  int sec;
  time_t temps = time(0);
  struct tm *tl = localtime(&temps);
  strftime(Date,50,"%d/%m/%Y -- %H:%M:%S",tl);

  return temps;
}

float temperature(void)
{
  return 20-((rand()%100)/5.0)+((rand()%100)/5.0);
}

void saisi(char nom[])
{
    FILE *fichier;
    char datenow[50];
    Getdate(datenow);
        if( (fichier fopen(nom,"r")) 0 )
    {
      fichier = fopen(nom,"w");
    }
    else
    {
      fichier = fopen(nom,"a");
    }
    
    fprintf(fichier,"\n %s \t %.2f ",datenow,temperature());
    fclose(fichier);
}

void wait (int n)
{
  int sec;
  sec = time(0);
  while(difftime(time(0),sec)<n)
  ;
  
}
int main (void)
{
  int datactu,n=0;
  char date[50],nom[50];
  srand(time(0));
  printf("Saisir le nom du fichier: ");
  gets(nom);
  
  datactu = Getdate(date);
  printf("Date debut: %s \n",date);
  saisi(nom);
  for(n=0;datactu+120+10 != Getdate(date);n++) //pendant 120sec 2min
  {   
      printf("\r %d sec",(n*10));  
      wait(10);       //toutes les 10sec
      saisi(nom);
  }

  printf("\nFIN\a");
  getchar();
  return 0;
}



Merci.

KRIS 83
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

Salut,

Il faut :
ouvrir ton fichier avec fopen, en mode lecture.
lire (avec fread) 3 chaines de caracteres (date, le --, l'heure), puis lire un double pour la température. Ceci pour chaque ligne.
Je précise que fread avance à chaque lecture, pas besoin de fseek.
Penses à tester la fin de fichier avec feof, et eventuellement controler les erreurs avec ferror. Fermer le fichier.
C'est possible d'aller beaucoup plus vite, mais en sacrifiant le controle d'erreurs.
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

Dans ton code

fprintf(fichier,"\n %s \t %.2f ",datenow,temperature())

je suggere de fixer la longueur de ton float en utilisant %03.2f qui logiquement padde a gauche avec des 0 la partie entiere du float.

tu obtiens ainsi : 018.60 qui est alors de longueur fixe.

apres cela tu crees uns struct :
struct mystruct {
char dummy[23]; \\ 20/12/2004 -- 15:44:12
char temperature[6];
}
puis tu fais un read du fichier en suivant les conseil de plu_plus_fab

fread(mystruct, sizeof ( struct mystruct), 1,myfile);

apres cela utilise le scanf() pour extraire un float du champ temperature de la structure.

Je deteste scanf() aussi je te conseille de te reporter au man pages pour son utilisation.

PS : renomme ta fonction wait () car si tu utilise unix/linux et en general gcc il existe un fonction wait() en libraries.
il est preferable d'utiliser les fonction setitimer(), getitimer() pour faire ton wait. (si tu roule gcc/unix-Linux bien sur :) )

Yves
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

Dans ton code

fprintf(fichier,"\n %s \t %.2f ",datenow,temperature())

je suggere de fixer la longueur de ton float en utilisant %03.2f qui logiquement padde a gauche avec des 0 la partie entiere du float.

tu obtiens ainsi : 018.60 qui est alors de longueur fixe.

apres cela tu crees uns struct :
struct mystruct {
char dummy[23]; \\ 20/12/2004 -- 15:44:12
char temperature[6];
}
puis tu fais un read du fichier en suivant les conseil de plu_plus_fab

fread(mystruct, sizeof ( struct mystruct), 1,myfile);

apres cela utilise le scanf() pour extraire un float du champ temperature de la structure.

Je deteste scanf() aussi je te conseille de te reporter au man pages pour son utilisation.

PS : renomme ta fonction wait () car si tu utilise unix/linux et en general gcc il existe un fonction wait() en libraries.
il est preferable d'utiliser les fonction setitimer(), getitimer() pour faire ton wait. (si tu roule gcc/unix-Linux bien sur :) )

Yves
Messages postés
9
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
22 décembre 2004

OK merci pour vos conseils, j'ai pris note et je vais m'y mettre

KRIS 83
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

hum, c'est quand meme plus simple de lire un float avec fscanf !!!
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

T'as raison plus_plus_fab fscanf() est plus simple, mais je ne fais que donner la fonction generique. Chaque programer a ses propres gouts.

Yves