conversion chaine de caractere / en numerique

conversion chaine de caractere / en numerique - C - Programmation

Marsh Posté le 09-06-2004 à 08:51:22    

Bonjour, je suis actuellement en stage et j'ai comme projet d effectuer un traitement sur des fichiers textes. Mais voila que les pb commences.
 
exemple de 2 lignes du fichier:
 
10/01/04,00:07:45;080,02;Ko.
10/01/04,00:08:58;080,02;Ok,ReceptionDM.
 
codage deja effectue :
void main ...
 
|
|
|
 
FILE *temporaire;
FILE *lignes;
FILE *duree;
FILE *casParticulier;
char nomfich[20],*test2,*test1,*mot1,*mot2,*temp,*temp1,*fin,*phras;
char caracteres[TAILLE];
int nblignes,i,z;
double retablissement;
 
char temporaire_fic[500]="TEMPORAIRE_";
char duree_fic[500]="DUREE_";
 
do{
 test1=strstr(caracteres,"Ok" );
     
 if(test1==NULL){  
 transforme1(caracteres);
        fgets(caracteres,TAILLE-1,lignes);
        test2=strstr(caracteres,"Ko" );
       
       
 if (test2==NULL){
 
  transforme2(caracteres);    
  if((strcmp(DATE1,DATE2)==NULL)&&(strcmp(NUMNOEUD1,NUMNOEUD2)==NULL)&& (strcmp(NUMLIGNE1,NUMLIGNE2)==NULL)){
                                                                       //fonctionne pas.     retablissement=difftime(date2,date1);
                  transforme(caracteres);
           fputs(phrase,duree);
 
  }else{
   if(DATE1==DATE2){
    fgets(caracteres,TAILLE-1,lignes);
    test2=strstr(caracteres,"Ko" );      while(test2==NULL){  
    fgets(caracteres,TAILLE-1,lignes);}
   }else{
    if ((temporaire=fopen(temporaire_fic,"wt" ))==NULL){
          printf("\n Erreur d'ouverture du fichier temporaire" );
                                 }else{
     transformeCasParticulier(caracteres);
     fputs(phrase,temporaire);
    }    
   }
  }  
   }else{
    fgets(caracteres,TAILLE-1,lignes);}
  }else{
   fgets(caracteres,TAILLE,lignes);   }while(!feof(lignes));  
 }fclose(duree);
  fclose(temporaire);
 }printf("\n fermeture du fichier duree" );
}
 
 
 
codage des fonctions:

//transforme1 et transforme2 sont identiques

void transforme1(char phras[TAILLE]){
char *temp1;
//etude de la ligne
 
       
  DATE1=recupmot1(',',phras,1);
  temp1 = strchr(phras,',');
  HEURE1 = recupmot1(';',temp1,0);
  temp1 = strchr(temp1,';');
  NUMNOEUD1 = recupmot1(',',temp1,0);
                temp1 = strchr(temp1,',');
                NUMLIGNE1 = recupmot1(';',temp1,0);
                strchr(temp1,';');
  strcat(phrase,"\n" );
}
 

//Recupmot1 et recupmot 2 sont identiques.

/*******************recupmot1*******************/
 
//fonction pour retourner un mot pour les test
 
 
char *recupmot1(char fin, char *phras,int type){
char mot1[TAILLE]="init";
char *test1;
 
int i,j;
 
test1=malloc(100);   //pour affacter une taille memoire et une adresse
j=0;
if(type==1)
 i=0;
else
 i=1;
while(phras[i]!=fin)
{
 mot1[j]=phras[i];
 j++;
 i++;
 
}mot1[j]='\0';
 
strcpy(test1,mot1);
 
return(test1);
}
 
 
 
 
grace a ce code je recupere les differents elements des lignes du fichier.
Mais une fois ce traitement effectuer je cherche a effectuer un calcul de temps de retablissement entre les 2 lignes, or DATE1 et DATE2 sont des chaines de caracteres.
--> comment faire pour les convertir en valeur numerique puis comment utiliser 'difftime' , je ne connais pas la structure de time_t.
Je me prends la tete depuis un moment et j'ai vraiment besoin d'aide sinon je vais   :pt1cable:  
 
Tant que je suis la , y aurait t il une bonne ame qui voudrait bien me dire aussi comment recuperer la date du jour et la mettre ensuite a la suite du nom du fichier et cela chaques fois que l'on ferme le fichier ou le resultat du traitement est insere ?
 
Merci bcp !!!
 
A+


Message édité par bombyce le 09-06-2004 à 09:34:46
Reply

Marsh Posté le 09-06-2004 à 08:51:22   

Reply

Marsh Posté le 09-06-2004 à 09:19:01    

quand on fait "man difftime" on trouve entre autres

Citation :


VOIR AUSSI
       date(1), gettimeofday(2), time(2), ctime(3), gmtime(3), localtime(3)

Reply

Marsh Posté le 09-06-2004 à 10:43:08    

Merci pour ton aide,
maintenant j'arrive a recuperer la date et l'heure mais je n'arrive pas a rajouter ces elements a la suite du nom du fichier.
 
A+

Reply

Marsh Posté le 09-06-2004 à 10:44:49    

à grands coups de sprintf ça ne devrait pas poser trop de problèmes [:spamafote]

Reply

Marsh Posté le 09-06-2004 à 11:03:45    

J'y arrive pas.
Je recupere la date, heure avec:
time_t t;
|
|
time(&t);    
printf("\n Affichage : %s", ctime(&t));  
 
et je cree mon fichier :
 
FILE *duree;
char duree_fic[500]="DUREE_";
|
|
duree=fopen(duree_fic,"wt" )
 
 
je pensai que je devais faire une concatenation apres le nom du fichier.
J ai essayer avec sprintf et j'y arrive pas:
sprintf(duree,ctime(&t));
pourrais tu m'expliquer?

Reply

Marsh Posté le 09-06-2004 à 11:08:19    

tu sais utiliser un printf non?
bah sprintf ça marche pareil...  
si tu sais faire printf("%s",ctime(&t)) tu sais faire printf("prefixe%s",ctime(&t)) donc tu sais faire sprintf(machaine,"prefixe%s",ctime(&t));

Reply

Marsh Posté le 09-06-2004 à 11:08:25    

char myfilename[MAX_PATH];
sprintf(myfilename,"duree_%s",ctime($t));
duree=fopen(myfilename,"wt" );
 
je pense que tu peux faire qqchose dans ce genre la.
 
edit : grillaid


Message édité par nico168 le 09-06-2004 à 11:09:33
Reply

Marsh Posté le 09-06-2004 à 14:03:25    

Merci pour votre aide.
 
A+

Reply

Marsh Posté le 09-06-2004 à 14:03:30    

Merci pour votre aide.
 
A+

Reply

Marsh Posté le 11-06-2004 à 09:31:07    

Code :
  1. void main(int argc,char *argv[])
  2. {
  3. FILE *temporaire;
  4. FILE *lignes;
  5. FILE *duree;
  6. FILE *casParticulier;
  7. struct date jour;
  8. time_t t;
  9. char nomfich[20],*test2,*test3,*test4,*test1,*mot1,*mot2,*temp,*temp1,*fin,*phras;
  10. char caracteres[TAILLE];
  11. int i,z;
  12. int nblignes;
  13. double retablissement;
  14. char temporaire_fic[500]="TEMPORAIRE";
  15. char duree_fic[500]="DUREE_";
  16. |
  17. |
  18. |
  19. time(&t);   
  20. printf("\n Affichage : %s", ctime(&t)); 
  21. sprintf(duree_fic,"duree_%s",ctime(&t));
  22. printf("\n duree_fic : %s",duree_fic);
  23. if ((duree=fopen(duree_fic,"wt" ))==NULL){
  24.          printf("\n Erreur d'ouverture du fichier de traitement
  25.          des durees" );
  26. }else{
  27.         if ((temporaire=fopen(temporaire_fic,"r+" ))==NULL){


 
 
 
Je pensais ne plus avoir de probleme apres avoir rajoute les infos du jour au nom du fichier, mais maintenant  quand je fais le test j'obtient toujours : "Erreur d'ouverture du fichier de traitement  des durees"
or je veux pouvoir rentrer dans le 'else'.
 
Je ne comprends pas pourquoi ça ne marche pas.
Quelqu un peut il m'eclairer?
Merci.  

Reply

Marsh Posté le 11-06-2004 à 09:31:07   

Reply

Marsh Posté le 11-06-2004 à 09:49:49    

peux tu nous montrer se qu'affiche ton programme ? ou du moins, le contenu de duree_fic.
 

Code :
  1. fopen(duree_fic,"wt" )


 
dans mon man fopen, j'ai pas de mode d'ouverture avec "t", c'est censé faire quoi ?


Message édité par nico168 le 11-06-2004 à 09:53:33
Reply

Marsh Posté le 11-06-2004 à 09:52:14    

cela m'affiche:
duree_fic: duree_Fri Jun 11 09:33:28 2004

Reply

Marsh Posté le 11-06-2004 à 09:56:40    

peut etre qu'il n'aime pas les espaces ou les ":" dans le nom, ou alors mon post plus haut que j'ai édité a propos du "t"

Reply

Marsh Posté le 11-06-2004 à 10:02:39    

J'y ai pense et avec l'aide d un autre on a fait ça :
 
struct date *jour;
|
|
getdate(&jour);
itoa(jour.da_day,jjour,10);
itoa(jour.da_mon,mmois,10);
itoa(jour.da_year,aannee,10);
strcpy(duree_fic , jjour);
strcat(duree_fic, "_" );
strcat(duree_fic , mmois);
strcat(duree_fic, "_" );
strcat(duree_fic , aannee);
strcat(duree_fic , ".his" );
 
on obtient alors  11_06_2004.his
et j'ai toujours le meme pb!!!
 
Alors je bloque , je m'enerve et je casse tout !
 

Reply

Marsh Posté le 11-06-2004 à 10:32:33    

et tu m'as pas repondu, il sert a quoi le "t" dans le mode d'ouverture de fopen ?

Reply

Marsh Posté le 11-06-2004 à 10:54:09    

le t de fopen ..."wt"   sert a indiquer qu il s agit d un fichier texte.
 
par exemple pour un fichier en binaire , il y aurait b.

Reply

Marsh Posté le 11-06-2004 à 10:59:56    

ha ok, c'est un nuance qui n'existe pas sous unix.
tu peux voir le contenu de errno apres l'appel a fopen, ca peu te donner des indications


Message édité par nico168 le 11-06-2004 à 11:02:55
Reply

Marsh Posté le 11-06-2004 à 11:08:08    

rectification , maintenant avec la deuxieme methode ça marche mais cela me fait une erreur sur le test de l'ouverture du fichier 'temporaire'  :ouch:  :pt1cable:  
 
void main(int argc,char *argv[])
{
FILE *temporaire;
FILE *lignes;
FILE *duree;
FILE *casParticulier;
struct date jour;
 
char nomfich[20],*test2,*test3,*test4,*test1,*mot1,*mot2,*temp,*temp1,*fin,*phras;
char caracteres[TAILLE];
int i,z;
int nblignes;
double retablissement;
 
char temporaire_fic[500]="TEMPORAIRE";
char duree_fic[500]="DUREE_";
char jjour[5], mmois[5], aannee[5];
|
|
|
itoa(jour.da_day,jjour,10);
itoa(jour.da_mon,mmois,10);
itoa(jour.da_year,aannee,10);
|
|
|
strcpy(duree_fic , jjour);
strcat(duree_fic, "_" );
strcat(duree_fic , mmois);
strcat(duree_fic, "_" );
strcat(duree_fic , aannee);
strcat(duree_fic , ".his" );
 
if ((duree=fopen(duree_fic,"at" ))==NULL){
 printf("\n Erreur d'ouverture du fichier de traitement des durees" );  
}else{
 if ((temporaire=fopen(temporaire_fic,"r+" ))==NULL){  
                        //effectuer un traitement.
        }else{
                        //effectuer second traitement.

Reply

Marsh Posté le 11-06-2004 à 11:20:28    

meme remarque, consulte errno pour avoir plus d'info sur l'erreur

Reply

Marsh Posté le 11-06-2004 à 11:25:51    

errno --> kesako ?
 
(c les erreurs que m'affiche le compilateur?, si c 'est ça ; le compilateur ne m'affiche pas d'erreur ,c'est a l'execution que cela ne fais pas ce que je veux)

Reply

Marsh Posté le 11-06-2004 à 11:34:25    

ben tu serais sous unix je te repondrais "man errno"  :)
par contre stfw(1) est multiplateforme :)
 
(1) search the fucking web

Reply

Marsh Posté le 11-06-2004 à 12:10:19    

OK  :D  
 
je connaissais pas mais ça me plait  :bounce:  
A+

Reply

Marsh Posté le 11-06-2004 à 13:28:17    

le "t" n'existe pas selon, l'ANSI, le mode par défaut étant le mode texte

Reply

Marsh Posté le 11-06-2004 à 13:36:09    

D'accord.
Mais tu aurais une explication pour moi sur le fait que mon programme n'effectue jamais le second traitement?
 
A+

Reply

Marsh Posté le 11-06-2004 à 13:57:48    

ton ouverture de fichier échoue, voilà tout

Reply

Marsh Posté le 11-06-2004 à 14:16:48    

c corrige , merci Taz
A+

Reply

Marsh Posté le 11-06-2004 à 14:30:13    

y'a des trucs que je comprends pas des fois...
tu as ecrit ce code la :

Code :
  1. if ((temporaire=fopen(temporaire_fic,"r+" ))==NULL){ 
  2.                        //effectuer un traitement.
  3.        }else{
  4.                        //effectuer second traitement.


 
qu'on pourrait ecrire en pseudo-langage :

Code :
  1. ouvrir le fichier et si l'ouverture ce passe mal
  2.           effectuer traitement
  3. sinon
  4.           effectuer second traitement


 
et tu te demandais pourquoi tu ne vas pas dans le second traitement ?
 
edit s/bien/mal


Message édité par nico168 le 11-06-2004 à 14:32:21
Reply

Marsh Posté le 11-06-2004 à 14:55:50    

je sais j'avais ecrit des conneries, me suis emmele les pinceaux.
 
en fait ce que je fais c 'est si un fichier temporaire existe (ce fichier regroupe des lignes en desaccord avec le reste du fichier en cour de traitement) j'effectue un traitement ou je compare le contenue de 2 fichiers (ici temporaire et duree puis effectue un traitement entre les 2 et ensuite effectue un nouveau traitement sur duree uniquement afin d'etablir une duree de temps entre 2 heures), soit j'effectue uniquement le traitement sur duree qd temporaire n'existe pas.  
 
A+

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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