begin process at 2010 03 19 19:21:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

Probleme de param


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de param

lundi 31 janvier 2005 à 01:14:43 | Probleme de param

PatSW

Je vien tout juste de créer un tit prog pour convertir un fichier en fichier texte
hexadecimal. Je suis quelque peu débutant en c/c++ alors je voudrais savoir
comment je pourrais améliorer celui-ci. J'ai aussi un petit probleme:

la façon dont ce prog fonctionne c'est que je glisse un fichier dessu et il le
convertit, mais lorsque j'en glisse plusieurs à la fois, il ne les convertit pas tous:
si je glisse 2 fichier, il en converti 1;
3 -> 2;
4 -> 2;
5 -> 3;

j'ai essayer de plusieurs façon et c'est toujours le même probleme, même
en passant les parametre a l'aide de l'invite de command windows.

Merci d'avance!

The Universal ßð¥
lundi 31 janvier 2005 à 01:30:19 | Re : Probleme de param

PatSW

J'ai oublier de mettre la source:

#include <windows.h>
#include <math.h>

char* ByteToHex(BYTE c)
{
 const char H[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 float n;
 int i;
 char h[2];
 char *r;
 n=c;
 n=n/16;
 i=(int)floor(n);
 h[0]=H[i];
 n=n-i;
 n=n*16;
 i=(int)n;
 h[1]=H[i];
 r=h;
 return r;
}

int main(int argc,char **argv)
{
 HANDLE hSrcFile, hDestFile;
 char *SrcFile, *DestFile;

 for(int i=1;i!=argc;i++)
 {
  SrcFile=argv[i];

  hSrcFile = CreateFile(SrcFile,
         GENERIC_READ,
         FILE_SHARE_READ,
         NULL,
         OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL,
         NULL);

  if(hSrcFile != INVALID_HANDLE_VALUE)
  {
   DestFile=strcat(SrcFile,".txt");

   hDestFile = CreateFile(DestFile,
           GENERIC_WRITE,
           NULL,
           NULL,
           CREATE_ALWAYS,
           FILE_ATTRIBUTE_NORMAL,
           NULL);

   if(hSrcFile != INVALID_HANDLE_VALUE)
   {
    char SrcData[1024], DestData[2048];
    int FileSize = GetFileSize(hSrcFile,NULL)-1;
    DWORD nobr, nobw;
    char *Hex;
    bool eof=false;

    while(!eof)
    {
     ReadFile(hSrcFile, SrcData, 1024, &nobr, 0);
     
     for(int n=0;n<(int)nobr;n++)
     {
      Hex=ByteToHex(SrcData[n]);
      DestData[n*2]=Hex[0];
      DestData[n*2+1]=Hex[1];
     }

     WriteFile(hDestFile, DestData, nobr*2, &nobw,0);
     
     if(nobr!=1024) eof=true;
    }
   }

   CloseHandle(hDestFile);
  }

  CloseHandle(hSrcFile);
 }
 return 0;
}

The Universal ßð¥

lundi 31 janvier 2005 à 02:01:35 | Re : Probleme de param

bayeto

Membre Club
Réponse acceptée !
char *SrcFile, *DestFile;
//...
DestFile=strcat(SrcFile,".txt");

oula ca marche ça chez toi? Je pense que ça ecrase les valeurs suivantes de argv
essaye plutot ca

char *SrcFile,DestFile[MAX_PATH]
//...
strcpy(DestFile,SrcFile);
strcat(DestFile,".txt");
lundi 31 janvier 2005 à 09:36:22 | Re : Probleme de param

BruNews

Administrateur CodeS-SourceS
Faut refaire ta ByteToHex(), une calamité en terme de performance. Supprime le float et ne bosser que sur du UINT.

ciao...
BruNews, MVP VC++
lundi 31 janvier 2005 à 16:42:56 | Re : Probleme de param

PatSW

Salut BruNews,

J'ai chercher un peu sur le site pour des fonctions de conversion vers hexa, mais je n'en ai trouvé aucune utilisant UINT, mais j'ai vu ta fonction IntToBin qui est très intéressante!

Je voudrais savoir, comment tu ferais un ByteToHex ou IntToHex ou CharToHex (laquelle de ces fonctions serait la meilleure) ?

Merci

The Universal ßð¥
lundi 31 janvier 2005 à 17:48:33 | Re : Probleme de param

ymca2003

Non seulement elle n'est pas optimisée mais en plus erronée. On ne renvoi JAMAIS un pointeur sur une variable ou buffer local à une fonction. Pour renvoyer un pointeur il faut soit l'allouer soit utiliser une variable static. Dans ton cas ça marche peut-être car la pile n'est pas utilisée après l'appel de la fonction mais en général ça plante.

le plus simple :
szVal[3];
BYTE b = 123;
BYTE hi = (b>>4)&0xf;
BYTE lo = b&0xf;
szVal[0] = (hi<=9) ? '0'+hi : 'A'+hi-10;
szVal[1] = (lo<=9) ? '0'+lo : 'A'+lo-10;
szVal[2] = '\0';

sinon il y a la fonction atoi qui permet de transformer un entier en chaîne dans la base que tu veux (16 pour toi)
szVal[16];
BYTE b = 123;
itoa(b, szVal, 16);
lundi 31 janvier 2005 à 23:28:55 | Re : Probleme de param

BruNews

Administrateur CodeS-SourceS
ah oui, retour d'un pointeur sur variable locale, je n'avais pas lu jusqu'au bout.

ciao...
BruNews, MVP VC++
mardi 1 février 2005 à 02:28:25 | Re : Probleme de param

PatSW

Salut ymca,

en me basant sur la function IntToBin de BruNews et ta suggestion, j'ai écrit ceci:

char* __stdcall StrToHex(char *str, char *psz)
{
 for(int i=0;i<5000;i++)
 {
  int hi = (str[i]>>4)&0xf;
  int lo = str[i]&0xf;

  *psz++ = (hi<=9) ? 48+hi : 55+hi;
  *psz++ = (lo<=9) ? 48+lo : 55+lo;
 } 
 *psz = 0;
 return psz;
}

puis j'ai tester ceci  
  *psz++ = 48+hi+7*(hi>=9);
  *psz++ = 48+lo+7*(lo>=9);
au lieu de ceci  
*psz++ = (hi<=9) ? 48+hi : 55+hi;
  *psz++ = (lo<=9) ? 48+lo : 55+lo;

puis j'ai fais les test de vitesse, et ma fonction est plus rapide que celle que tu ma suggéré...
J'ai aussi testé avec itoa, mais c'est beaucoup trop lent!!!

SOURCE DU TEST DE VITESSE:

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

char* __stdcall StrToHex(char *str, char *psz)
{
 for(int i=0;i<5000;i++)
 {
  int hi = (str[i]>>4)&0xf;
  int lo = str[i]&0xf;

//ma facon:  
  *psz++ = 48+hi+7*(hi>=9);
  *psz++ = 48+lo+7*(lo>=9);
//ta façon:
  //*psz++ = (hi<=9) ? 48+hi : 55+hi;
  //*psz++ = (lo<=9) ? 48+lo : 55+lo;
 }
 
 *psz = 0;
 return psz;
}

int main()  {
 char tmp [10000],mstr [5000];
 clock_t t1,t2;
 srand(time(NULL));
 for(int i=0; i<5000; i++)
 {
  mstr[i]=rand()%255;
 }

 t1=clock();
 for (i=0 ; i < 10000; i++ ) {
 StrToHex(mstr,tmp);
 }
 printf(tmp);
 t2=clock();
 printf("Temps d'execution: %d ms\n",(t2-t1));
 return 0;
}

Merci quand même pour ta suggestion sans laquelle je n'aurais jamais pu faire la mienne :)

The Universal ßð¥

mardi 1 février 2005 à 02:35:08 | Re : Probleme de param

PatSW

Petite question en passant:

j'ai mit for(int i=0; i<5000;i++) en sachant que "str" aurait tjrs 5000 caratere ds mon teste mais comment faire pour detecter la vrai longeur du buffer str??

strlen ? sizeof ? ou quoi?

J'en profite aussi pour remercier BruNews....

The Universal ßð¥
mardi 1 février 2005 à 05:19:44 | Re : Probleme de param

PatSW

Correction:

  *psz++ = 48+hi+7*(hi>=9);
  *psz++ = 48+lo+7*(lo>=9);

hi>=9 doit etre hi>=10 ou hi>9
lo>=9 doit etre lo>=10 ou lo>9

resultat:

  *psz++ = 48+hi+7*(hi>9);
  *psz++ = 48+lo+7*(lo>9);

The Universal ßð¥

1 2

Cette discussion est classée dans : fichier, probleme, prog, param, glisse


Répondre à ce message

Sujets en rapport avec ce message

probleme de trie [ par censure ] voila je vous espose mon probleme, je dois realiser un programme qui doit aller lire les noms, les prenoms et les dates de naissance de personne dans chaines de caractère [ par overfun ] salut à tous,voila mon probleme:j'ai fait un mini programme ( je suis debutant ) qui écrit des données dans un fichier mais le probleme c'est que je n Prob de prog !!! [ par thomas ] Voila mon probleme. tout d'abord j'utilise Builder C++.Je veux que quand je clique sur un fichier specifique a mon logiciel, ilouvre celui-ci et mette Prob de prog !!! [ par thomas ] Voila mon probleme. tout d'abord j'utilise Builder C++.Je veux que quand je clique sur un fichier specifique a mon logiciel, ilouvre celui-ci et mette Probleme de compilation [ par draken ] Bonjour à tous ,mon but est de placer chaque classe dans chaque fichier --> utilisation separee des classes VOICI LE PROBLEME Probleme de gestion de fichier et gestion de l ehrue en C [ par croft ] Mr.croftG un probleme avec un fichier texte contenant un mot sur chaque ligne .Il me faudrait un code qui pourrrait me ressortir aleatoirment un mot d constante ds fichier d'entete [ par bidules ] bonjour,j'ai un probleme avec des constante declarer ds un fichier d'entete.Je travail en c.le compilateur dit que la constante est deja defini ds le Probleme avec le parcours du fichier txt [ par leskritiques ] Je voudrais parcourir un fichier texte en lui ajoutant des dates et ranger les dates par rapprot a la date du jour de la plus recente a la plus ancien probleme dup2 / socket [ par stick ] bonjours,je developpe actuellement un mini-server web avec support cgi, pour l'instant tous mes tests avec perl ont été plus que concluant, MAIS, en t probleme d'include [ par titus0m ] bonjour,je develop sous kdev sous linux.mon probleme est un conflit entre deux include qui possede une fonction qui se nomme pareil. C'est la fonction


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales