begin process at 2012 05 27 16:24:29
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caractères

 > FONCTIONS DE TRAITEMENT RAPIDE DE CHAINES ET FICHIER

FONCTIONS DE TRAITEMENT RAPIDE DE CHAINES ET FICHIER


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Chaîne de caractères Classé sous :traitement, chaine, fichier Niveau :Débutant Date de création :01/04/2004 Date de mise à jour :08/04/2004 20:37:35 Vu / téléchargé :6 250 / 176

Auteur : uxtobirza

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

C'est une librairie qui reprend une partie des fonctions de stdio.h et string.h
mais avec de l'assembleur dedans. Gain de vitesse important !
D'autres fonctions permettent de copier un fichier, savoir si il existe
ou quelle est sa taille.
attention : c++ builder professionel recommandé, parcce que sinon il faut retoucher le code.


Source

  • #include <vcl.h>
  • #include <dir.h>
  • #include <stdio.h>
  • #include "text.h"
  • #pragma hdrstop
  • #pragma inline
  • //---------------------------------------------------------------------------
  • //---------------------------------------------------------------------------
  • void tomin(char *ZString); // convertir une chaine en minuscules
  • void tomaj(char *ZString); // convertir une chaine en majuscules
  • char Tolower(char ZString); //
  • char Toupper(char ZString); // convertit un caractere en
  • void Strcpy(char *ch1, char *ch2);
  • void Strcat(char *ch1, char *ch2);
  • int Atoi(char *ZString);// convertit une chaine en integer
  • unsigned int Strlen(char *ZString); // retourne la longueur d'une chaine
  • bool file_available(char *mossieu); // retourne vrai si fichier existeu
  • long filesize(FILE *safe); // retourne la taille d'un fichier ouvert
  • void copyfile(char *setFrench,char *getFrench);// copier un fichier
  • void ajouter_mot_au_fichier(FILE *fichier, char *chemin,char *mot);
  • int trouvermot_dans_fichier(FILE *fichier, char *tst);
  • //---------------------------------------------------------------------------
  • //---------------------------------------------------------------------------
  • // tomin: convertit une chaine en minuscules
  • void tomin(char *ZString)
  • {
  • asm{
  • mov ecx,ZString
  • debut2:
  • mov al, BYTE PTR [ecx]
  • cmp al,0
  • je short fin2
  • cmp al, 41h
  • jb short inter2
  • cmp al, 5Ah
  • ja short inter2
  • or al, 20h
  • mov BYTE PTR [ecx], al
  • inter2:
  • inc ecx
  • jmp short debut2
  • fin2:
  • mov ecx, [ZString]
  • }
  • }
  • //---------------------------------------------------------------------------
  • // tomaj: convertit une chaine en majuscules
  • void tomaj(char *ZString)
  • {
  • asm{
  • mov edx,ZString
  • debut:
  • mov al, BYTE PTR [ecx]
  • cmp al,0
  • je short fin
  • cmp al, 61h
  • jb short inter
  • cmp al, 7Ah
  • ja short inter
  • and al, 0DFh
  • mov BYTE PTR [ecx], al
  • inter:
  • inc ecx
  • jmp short debut
  • fin:
  • mov ecx, [ZString]
  • }
  • }
  • //---------------------------------------------------------------------------
  • char Tolower(char ZString)
  • {
  • asm{
  • mov al, ZString
  • cmp al,0 // ==0
  • je short fini
  • cmp al, 41h // <'A'
  • jb short fini
  • cmp al, 5Ah // >'Z'
  • ja short fini
  • or al, 20h // minusculiser
  • fini:
  • }
  • }
  • //---------------------------------------------------------------------------
  • char Toupper(char ZString)
  • {
  • asm
  • {
  • mov al, ZString
  • cmp al,0 // ==0
  • je short fini2
  • cmp al, 61h // <'a'
  • jb short fini2
  • cmp al, 7Ah // >'z'
  • ja short fini2
  • and al, 0DFh // majusculiser
  • fini2:
  • }
  • }
  • //---------------------------------------------------------------------------
  • // la même que dans string.h ou stdio, mais en assembleur
  • void Strcpy(char *ch1, char *ch2)
  • {
  • asm
  • {
  • mov edx,ch1
  • mov ecx,ch2
  • debutas:////////
  • mov al, byte ptr [ecx]
  • cmp al,0 // si code ascii= 0
  • je short endas // alors fin
  • mov byte ptr [edx], al // sinon copier ds cible
  • inc ecx // incrementer source
  • inc edx // incrementer cible
  • jmp short debutas // retour boucle
  • endas:///////// // fin boucle
  • mov byte ptr [edx], 0 // 0 pour finir chaine
  • mov ch1,edx
  • }
  • }
  • //---------------------------------------------------------------------------
  • void Strcat(char *ch1, char *ch2)
  • {
  • asm
  • {
  • mov edx,ch1
  • mov ecx,ch2
  • debut03:
  • mov al, byte ptr [edx]
  • cmp al,0
  • je short mid03
  • inc edx
  • jmp short debut03
  • mid03:
  • mov al, byte ptr [ecx]
  • cmp al,0
  • je short end04
  • mov byte ptr [edx], al
  • inc ecx
  • inc edx
  • jmp short mid03
  • end04:
  • mov byte ptr [edx],0
  • }
  • }
  • //---------------------------------------------------------------------------
  • // Atoi: convertit une chaine en integer
  • int Atoi(char *ZString)
  • {
  • int base=10;
  • int valeur=0;
  • asm{
  • mov ecx,ZString
  • xor bh, 0
  • DEBU8: // debut boucle
  • mov bl, BYTE PTR [ecx] // chercher l'ofset
  • cmp bl, 030h // si < '0'
  • jb short Fin8 // fin
  • cmp bl, 039h // si > '9'
  • ja short Fin8 // fin
  • and bl ,0CFh // soustraire '0' soit 48
  • mul base // multiplier par 10
  • add ax, bx // ajouter nouveau chiffre
  • inc ecx // caractere suivant
  • jmp short DEBU8
  • Fin8:
  • mov word ptr [valeur], ax
  • }
  • }
  • //---------------------------------------------------------------------------
  • // strlen: retourne la longueur d'une chaine
  • unsigned int Strlen(char *ZString)
  • {
  • int lon=0;
  • asm{
  • xor eax,0
  • mov ecx,ZString
  • debut9:
  • cmp BYTE PTR [ecx],0 // si fin de chaine
  • je short fin9 // saut fin boucle
  • inc eax // sinon
  • inc ecx // incrementer
  • jmp short debut9 // retour boucle
  • fin9: // fin boucle
  • mov dword ptr [lon], eax
  • }
  • }
  • //---------------------------------------------------------------------------
  • // filesize: retourne la taille du fichier (qui doit etre ouvert)
  • long filesize(FILE *safe)
  • {
  • long curpos, length;
  • curpos = ftell(safe);
  • fseek(safe, 0L, SEEK_END);
  • length = ftell(safe);
  • fseek(safe, curpos, SEEK_SET);// remettre la position initiale
  • return length;
  • }
  • //---------------------------------------------------------------------------
  • // file_available : retourne vrai si le fichier existe
  • bool file_available(char *nomfichier)
  • {
  • FILE *safe;
  • if((safe=fopen(nomfichier,"rb"))!=NULL)
  • {
  • fclose(safe);
  • return true;
  • }
  • else
  • return false;
  • }
  • //---------------------------------------------------------------------------
  • void copyfile(char *setFrench,char *getFrench)
  • {
  • FILE *source, *cible;
  • source =fopen(setFrench,"rb");
  • cible =fopen(getFrench,"wb");
  • while(true)
  • {
  • register c=fgetc(source);
  • if(feof(source))break;
  • fputc(c,cible);
  • }
  • fclose(cible);
  • fclose(source);
  • }
  • //---------------------------------------------------------------------------
  • void ajouter_mot_au_fichier(FILE *fichier, char *chemin,char *mot)
  • {
  • if ((fichier=fopen(chemin,"a"))!=NULL)
  • {
  • fprintf(fichier,"%s\n",mot);
  • fclose(fichier);
  • }
  • }
  • //---------------------------------------------------------------------------
  • int trouvermot_dans_fichier(FILE *fichier, char *tst)
  • {
  • fpos_t filepos=0;
  • fsetpos(fichier,&filepos);
  • bool bFin=false,bFound=false;
  • do
  • { // boucle fichier cible
  • char msg[256];
  • fscanf(fichier,"%s",msg);
  • //si mot trouvé alors sortie boucle fichier cible
  • if(tst[0]==msg[0] /*&& strlen(tst)==strlen(msg)*/)
  • {
  • if( !strcmp(msg,tst) )
  • {
  • bFin=true;
  • bFound=true;
  • }
  • }
  • if(feof(fichier))
  • {
  • bFin=true;
  • }
  • }
  • while(!bFin);
  • return (bFound);
  • }
  • //------------------------------------------------------------------------
#include <vcl.h>
#include <dir.h>
#include <stdio.h>
#include "text.h"
#pragma hdrstop
#pragma inline

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

void tomin(char *ZString);  // convertir une chaine en minuscules
void tomaj(char *ZString);  // convertir une chaine en majuscules
char Tolower(char ZString); //
char Toupper(char ZString); // convertit un caractere en
void Strcpy(char *ch1, char *ch2);
void Strcat(char *ch1, char *ch2);
int  Atoi(char *ZString);// convertit une chaine en integer
unsigned int Strlen(char *ZString);   // retourne la longueur d'une chaine

bool file_available(char *mossieu); // retourne vrai si fichier existeu
long filesize(FILE *safe); // retourne la taille d'un fichier ouvert
void copyfile(char *setFrench,char *getFrench);// copier un fichier
void ajouter_mot_au_fichier(FILE *fichier, char *chemin,char *mot);
int  trouvermot_dans_fichier(FILE *fichier, char *tst);


//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// tomin: convertit une chaine en minuscules
void tomin(char *ZString)
{
asm{
   mov ecx,ZString
   debut2:
   mov al, BYTE PTR [ecx]
   cmp al,0
   je short fin2
   cmp al, 41h
   jb short inter2
   cmp al, 5Ah
   ja short inter2
   or al, 20h
   mov BYTE PTR [ecx], al
   inter2:
   inc ecx
   jmp short debut2
   fin2:
   mov ecx, [ZString]
   }
}

//---------------------------------------------------------------------------
// tomaj: convertit une chaine en majuscules
void tomaj(char *ZString)
{
asm{
   mov edx,ZString
   debut:
   mov al, BYTE PTR [ecx]
   cmp al,0
   je short fin
   cmp al, 61h
   jb short inter
   cmp al, 7Ah
   ja short inter
   and  al, 0DFh
   mov BYTE PTR [ecx], al
   inter:
   inc ecx
   jmp short debut
   fin:
   mov ecx, [ZString]
   }
}

//---------------------------------------------------------------------------
char Tolower(char ZString)
{
asm{
    mov al, ZString
    cmp al,0       // ==0
    je short fini
    cmp al, 41h    // <'A'
    jb short fini
    cmp al, 5Ah    // >'Z'
    ja short fini
    or al, 20h     // minusculiser
    fini:
  }
}

//---------------------------------------------------------------------------
char Toupper(char ZString)
{
asm
  {
  mov al, ZString
  cmp al,0       // ==0
  je short fini2
  cmp al, 61h    // <'a'
  jb short fini2
  cmp al, 7Ah    // >'z'
  ja short fini2
  and  al, 0DFh  // majusculiser
  fini2:
  }
}

//---------------------------------------------------------------------------
// la même  que dans string.h ou stdio, mais en assembleur
void Strcpy(char *ch1, char *ch2)
{
asm
   {
   mov edx,ch1
   mov ecx,ch2
   debutas:////////
   mov al, byte ptr [ecx]
   cmp al,0               // si code ascii= 0
   je short endas         // alors fin
   mov byte ptr [edx], al // sinon copier ds cible
   inc ecx                // incrementer source
   inc edx                // incrementer cible
   jmp short debutas      // retour boucle
   endas://///////        // fin boucle
   mov byte ptr [edx], 0  // 0 pour finir chaine
   mov ch1,edx
   }
}

//---------------------------------------------------------------------------
void Strcat(char *ch1, char *ch2)
{
asm
   {
   mov edx,ch1
   mov ecx,ch2
   debut03:
   mov al, byte ptr [edx]
   cmp al,0
   je short mid03
   inc edx
   jmp short debut03
   mid03:
   mov al, byte ptr [ecx]
   cmp al,0
   je short end04
   mov byte ptr [edx], al
   inc ecx
   inc edx
   jmp short mid03
   end04:
   mov byte ptr [edx],0
   }
}

//---------------------------------------------------------------------------
// Atoi: convertit une chaine en integer
int  Atoi(char *ZString)
{
int base=10;
int valeur=0;

asm{
   mov ecx,ZString
   xor bh, 0
   DEBU8:                 // debut boucle
   mov bl, BYTE PTR [ecx] // chercher l'ofset
   cmp bl, 030h           // si < '0'
   jb short Fin8          // fin
   cmp bl, 039h           // si > '9'
   ja short Fin8          // fin
   and  bl ,0CFh          // soustraire '0' soit 48
   mul  base              //  multiplier par 10
   add  ax, bx            // ajouter nouveau chiffre
   inc ecx                // caractere suivant
   jmp short DEBU8
   Fin8:
   mov word ptr [valeur], ax
   }
}

//---------------------------------------------------------------------------
// strlen: retourne la longueur d'une chaine
unsigned int Strlen(char *ZString)
{
int lon=0;
asm{
   xor eax,0
   mov ecx,ZString
   debut9:
   cmp BYTE PTR [ecx],0  // si fin de chaine
   je short fin9         // saut fin boucle
   inc eax               // sinon
   inc ecx               // incrementer
   jmp short debut9      // retour boucle
   fin9:                 // fin boucle
   mov dword ptr [lon], eax
   }
}

//---------------------------------------------------------------------------
// filesize: retourne la taille du fichier (qui doit etre ouvert)


long filesize(FILE *safe)
{
long curpos, length;

   curpos = ftell(safe);
   fseek(safe, 0L, SEEK_END);
   length = ftell(safe);
   fseek(safe, curpos, SEEK_SET);// remettre la position initiale

return length;
}

//---------------------------------------------------------------------------
// file_available : retourne vrai si le fichier existe

bool file_available(char *nomfichier)
{
FILE *safe;
if((safe=fopen(nomfichier,"rb"))!=NULL)
 {
 fclose(safe);
 return true;
 }
else
 return false;
}

//---------------------------------------------------------------------------

void copyfile(char *setFrench,char *getFrench)
{
FILE *source, *cible;
source =fopen(setFrench,"rb");
cible =fopen(getFrench,"wb");

while(true)
  {
  register c=fgetc(source);
  if(feof(source))break;
  fputc(c,cible);
  }

fclose(cible);
fclose(source);
}

//---------------------------------------------------------------------------

void ajouter_mot_au_fichier(FILE *fichier, char *chemin,char *mot)
{

   if ((fichier=fopen(chemin,"a"))!=NULL)
     {
     fprintf(fichier,"%s\n",mot);
     fclose(fichier);
     }
}

//---------------------------------------------------------------------------

int trouvermot_dans_fichier(FILE *fichier, char *tst)
{

    fpos_t filepos=0;
    fsetpos(fichier,&filepos);
    bool bFin=false,bFound=false;

     do
      { // boucle fichier cible
      char msg[256];
      fscanf(fichier,"%s",msg);
      //si mot trouvé alors sortie boucle fichier cible
       if(tst[0]==msg[0] /*&& strlen(tst)==strlen(msg)*/)
         {
         if( !strcmp(msg,tst) )
            {
            bFin=true;
            bFound=true;
            }
          }

          if(feof(fichier))
            {
            bFin=true;
            }
      }
      while(!bFin);

return (bFound);
}

//------------------------------------------------------------------------



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip HEURE ATOMIQUE AVEC UNE SOCKET POUR C++ BUILDER
MASTER MIND CONSOLE
Source avec Zip OBJET TAQUIN

 Sources de la même categorie

CALCUL DE CLEF RIB par Renfield
Source avec Zip [C] WD_STRING V2.2 par cyberripper
Source avec Zip LES STRING EN C, AFFECTATION, CONCATÉNATION, SPLIT, ... par appranting
Source avec Zip [C] WD_STRING V1.9 par cyberripper
Source avec Zip LIBRAIRIE LANGUAGES par astro53

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip GESTION DES NOTES D'UNE CLASSE par scicasoft
Source avec Zip EDITEUR DE TEXTE EN LIGNE DE COMMANDE - C - DEVCPP - CHAINES... par pyronet
SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER par buno
Source avec Zip TROUVER UNE CHAINE DE CARACTÈRES(2) (WIN32) par BruNews

Commentaires et avis

Commentaire de BruNews le 01/04/2004 11:36:40 administrateur CS

Un fichier peut exister meme si on ne peut pas l'ouvrir, suffit qu'il ait ete ouvert en exclusif avant, donc file_exist a refaire.
copyfile() procede octet par octet si j'ai bien compris, auquel cas faudra pas etre presse.
ASM: le tout n'est pas d'empiler des instructions pour faire joli, faut viser la performance. C'est loin d'etre le cas ici:
- instructions longues: mov eax, 0 au lieu de xor eax, eax
- emploi de ebx a sauvegarder quand les generaux suffisent.
- Les boucles ne sont pas deroulees.

etc ....

Mieux vaut un C optimise que du mauvais asm, un compilo moderne aura vite fait mieux.
Le prends pas mal mais revois ta copie.

BruNews, Admin CS, MVP Visual C++

Commentaire de GoldenEye le 01/04/2004 14:53:32

Cette source est extrêmement intéréssante pour illustrer les propos de BruNews. Le paradigme de base est bien celui de ce dernier
"Mieux vaut un C optimisé qu'un médiocre ASM".
Les compilateurs modernes intègrent une série de règles d'optimisation de code performantes et à ce jour seul un bon programmeur ASM sera à même d'améliorer le code généré par le compilateur C.
De ce fait, n'ajouter que du (bon) code ASM que si la section est critique et requiert un contrôle total me semble fondamental.
Je serai bien curieux de voir le rapport de performances entre le code "classique" de string.h compilé en Release de VC++ et ton code ASM non retouché
L'effort est louable mais ne perds pas de vue le rapport efficacité réelle/travail founi

Commentaire de uxtobirza le 08/04/2004 20:51:22

Merci pour votre aide à tous. Voilà une nouvelle version, même si y a encore du boulot. Y'a plus qu'à dégrossir ? j'y retourne.
a+

Commentaire de BruNews le 10/04/2004 16:43:58 administrateur CS

Retour de Seattle, j'ai un peu plus de temps.
Voila exemple complet dans un prog win32.
Par principe si tu ecris une func en asm, faut la 'depouiller' afin de la controler completement, donc pas de declaration de variable ni 'return' ni rien d'autre. Si on mixe code C et ASM on gene l'optimisation du compilo, alors full asm ou rien.
Regarde strBinToInt(), j'ai mis en fastcall pour eviter empilage de param, on passe dans registre (ECX), ne pas oublier le ret final, ici avec 0 cause que rien de mis sur la pile.


#include &lt;windows.h&gt;

char szbuff[60];
char szappname[] = "Sample ASM inline";

__declspec(naked) int __fastcall strBinToInt(char *psz)
{ // ECX = psz, EDX autre param mais niet ici
  __asm {
    xor     eax, eax
next:
    mov     dl, byte ptr[ecx]
    sub     dl, 48
    jc      short tointExit
    cmp     dl, 1
    ja      short tointExit
    shl     eax, 1
    inc     ecx
    or      al, dl
    jmp     short next
tointExit:
    ret     0
  }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR szcmdline, int)
{
  int r;
  r = strBinToInt("001101101");
  itoa(r, szbuff, 10);
  
  MessageBox(0, szbuff, szappname, 0);
  return 0;
}

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

nom de fichier variable [ par Orkblutt ] salut,en gros voila ce ke je veux faire:char* chaine="Fichier.txt";ofstream fich(chaine);ceci ne me cré pas d'erreur de compil mais par contre le fich nom de fichier variable [ par Orkblutt ] salut,en gros voila ce ke je veux faire:char* chaine="Fichier.txt";ofstream fich(chaine);ceci ne me cré pas d'erreur de compil mais par contre le fich nom de fichier variable [ par Orkblutt ] salut,en gros voila ce ke je veux faire:char* chaine="Fichier.txt";ofstream fich(chaine);ceci ne me cré pas d'erreur de compil mais par contre le fich PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang Exploitation de fichier en C ?!?!?! [ par GazGaz ] lu allalors voila le truc c'est que je voudrais aller chercher des infos dans un fichier qui est structuré de la meme maniere lignes apres lignes. Je chaine de caractères et fichier [ par wanny ] Bonjour.Je voudrais savoir comment faire pour supprimer une chaine de caractères spécifiques dans un fichier texte...Merci d'avance.wanny fichier txt [ par freerider76 ] Bonjour je voudrais savoir comment faire pour changer une chaine de caractere dans un fichier txt, parce là je vois pas; en fait je pars comme ça et i chaine binaire ou non [ par Anacr0x ] Voila mon problème : je recoit en temps normal par socket une chaine que j'afiche ds un edit, seulement, j'ai crée un systeme d'envoi de fichier qui p gestion de fichier [ par franc015 ] salut !!!voila je débute et je dois faire un prog. je dispose d'un fichier texte ( en fait une liste de fichier avec des retours chariot entre chaque


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 1,591 sec (4)

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