begin process at 2012 05 28 23:03:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Conversion de vecteurs de test


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

Conversion de vecteurs de test

mardi 24 novembre 2009 à 20:57:02 | Conversion de vecteurs de test

devc26

Bonjour,
mon problème concerne la conversion d'un fichier de vecteurs (environs 2000lignes). Typiquement la conversion doit être de cette forme:avant la conversion le vecteur est le suivant:

IRB10_CY [0000000000, ffffffff, 00, 55, 10, 1110111111,00000000,0100001000100110, 1, 1111];

Aprés conversion:

V{'ANI'= 0000000000, ffffffff, 00, 55, 10, 1110111111, 00000000, 0100001000100110, 1, 1111};

Il faut en plus insérer un nouveau titre à chaque fois que l'expression "IRB10_CY" en tête de vecteur change.

J'ai commencé à développer en C++, seulement je bloque lorsqu'il faut récupérer les expressions "IRB10_CY" et les remplacer.J'ouvre le fichier d'origine, le recopie dans un nouveau mais je n'arrive pas à modifier ce qu'il faut. J'ai essayé avec les outils STL mais sans résulat.
Quelqu'un pourrait m'aider?
Merci d'avance.





samedi 28 novembre 2009 à 21:56:23 | Re : Conversion de vecteurs de test

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

La STL ? Pour une bête conversion, bof... Surtout que là c'est surtout du boulot niveau caractère.

Si tes fichiers font toujours environs 2000 lignes, tu peux les charger en entier en mémoire avec la lib standard C. Tu auras ainsi des performances optimales et un code simple.

Voici un bout de code qui fait la conversion mais l'affiche sur la console.
Après, il faut voir aussi quel degré de résistance tu veux pour ton programme par rapport au fichier d'entrée (Fichier d'entrée parfait ou non, présence d'espaces systématique ou non...).

Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define READING_HEADER 0
#define READING_VALUES 1

int main()
{
  FILE* lpFile;
  long nSize;
  char* lpFileContent;
  char lpPreviousHeader[20];
  char lpCurrentHeader[20];
  int nState;
  int nResult;
  long nI;
  long nJ;

  nResult = 1;

  /* Ouverture du fichier */
  lpFile = fopen("input.txt", "rb");
  if (! lpFile)
  {
    printf("Echec de l'ouverture du fichier d'entrée\n");
    goto the_end;
  }

  /* Récupération de la taille du fichier */
  fseek(lpFile, 0, SEEK_END);
  nSize = ftell(lpFile);
  if (! nSize)
  {
    printf("Le fichier d'entrée est vide\n");
    goto close_file;
  }
  fseek(lpFile, 0, SEEK_SET);

  /* Allocation d'un tampon pour récupérer le contenu du fichier */
  lpFileContent = (char*)malloc(nSize + 1);
  if (! lpFileContent)
  {
    printf("Echec de l'allocation de %ld octets\n", nSize);
    goto close_file;
  }

  /* Lecture du fichier et ajout d'un zéro terminal */
  if (fread(lpFileContent, 1, nSize, lpFile) != nSize)
  {
    printf("Echec de la lecture du fichier\n");
    goto free_memory;
  }
  lpFileContent[nSize] = 0;

  nI = 0;
  nJ = 0;
  nState = READING_HEADER;
  lpPreviousHeader[0] = 0;
  while (lpFileContent[nI])
  {
    switch (lpFileContent[nI])
    {
      case '[':
        printf("V{'ANI'= ");
        break;

      case ']':
        printf("};\n");
        nState = READING_HEADER;
        break;

      case '\n':
      case '\r':
      case ';':
        break;

      case ' ':
        if (nState == READING_HEADER)
        {
          lpCurrentHeader[nJ] = 0;
          if (strcmp(lpCurrentHeader, lpPreviousHeader))
          {
            printf("%s\n", lpCurrentHeader);
            strcpy(lpPreviousHeader, lpCurrentHeader);
          }
          nState = READING_VALUES;
          nJ = 0;
        }
        else
          printf(" ");
        break;

      default:
        if (nState == READING_HEADER)
        {
          lpCurrentHeader[nJ] = lpFileContent[nI];
          nJ++;
        }
        else
          printf("%c", lpFileContent[nI]);
    }
    nI++;
  }

  nResult = 0;

free_memory:
  free(lpFileContent);
close_file:
  fclose(lpFile);
the_end:
  return nResult;
}

lundi 30 novembre 2009 à 11:56:47 | Re : Conversion de vecteurs de test

devc26

Salut,

Merci pour tes lumières. En effet ton approche est beaucoup plus simple . Au niveau de la resistance du programme, peut importe le fichier d'entrée car la forme est toujours la même, les vecteurs de test sont similaires il n'y a que les valeurs et les noms des vecteurs qui changent.

Comment fais-tu pour écrire le résultat de la conversion dans un nouveau fichier texte avec le fwrite?...car dans mon ancienne version j'utilisais les ifstream/ofstream.

En utilisant ta partie de code, et en ayant fait une petite conversion des valeurs héxa en binaire, le résultat est le suivant:

V { ANI = 0000000000, 11111111111111111111111111111111, 10, 01010101, 10, 1110111111, 00000000, 0100001000100110, 1, 1111};

Arrivé à ce stade, la dernière étape est d'intégrer un nom entre chacun des 10 champs,est ce qu'il faut utiliser les "lpPreviousHeader, lpCurrentHeader" ou bien compter les bits ( le nombre de bits de chaque vecteur est fixe).

Merci beaucoup;
lundi 30 novembre 2009 à 12:47:07 | Re : Conversion de vecteurs de test

rt15

Membre Club Administrateur CodeS-SourceS
Pour l'écriture, le plus performant est d'utiliser un tampon de sortie, comme pour l'entrée. Il faudrait remplir le tampon au fur et à mesure, et l'écrire en une fois avec un fwrite. Faire un appel de fonction par caractère, mine de rien, ça prendrait un paquet de temps, surtout si c'est une écriture sur disque...

Pour insérer quelque chose tout les 10 champs, il me semble effectivement préférable de se fier à IRB10_CY plutôt qu'à une histoire de taille, car la taille à vite fait de changer sur un fichier texte (Par exemple la taille des sauts de lignes, 2 octets sous windows, 1 sous linux).

Code C/C++ :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define READING_HEADER 0
#define READING_VALUES 1

#define LINE_BEGINNING "V{'ANI'= "
#define LINE_ENDING "};\n"

int main()
{
  FILE* lpInputFile;
  FILE* lpOutputFile;
  long nSize;
  char* lpInputBuffer;
  char* lpOutputBuffer;
  char lpPreviousHeader[20];
  char lpCurrentHeader[20];
  char lpVectorSeparator[40];
  int nState;
  int nResult;
  long nI;
  long nJ;
  long nK;

  nResult = 1;

  /* Ouverture des fichiers */
  lpInputFile = fopen("input.txt", "rb");
  if (! lpInputFile)
  {
    printf("Echec de l'ouverture du fichier d'entrée\n");
    goto the_end;
  }
  lpOutputFile = fopen("output.txt", "w+");
  if (! lpOutputFile)
  {
    printf("Echec de l'ouverture du fichier de sortie\n");
    goto close_input_file;
  }

  /* Récupération de la taille du fichier */
  fseek(lpInputFile, 0, SEEK_END);
  nSize = ftell(lpInputFile);
  if (! nSize)
  {
    printf("Le fichier d'entrée est vide\n");
    goto close_output_file;
  }
  fseek(lpInputFile, 0, SEEK_SET);

  /* Allocation d'un tampon pour récupérer le contenu du fichier */
  lpInputBuffer = (char*)malloc(nSize + 1);
  if (! lpInputBuffer)
  {
    printf("Echec de l'allocation de l'entrée : %ld octets\n", nSize + 1);
    goto close_output_file;
  }

  /* Allocation d'un tampon pour récupérer le contenu du fichier */
  /* Attention : La taille nécessaire est approximé par deux fois la taille de l'entrée */
  lpOutputBuffer = (char*)malloc(nSize * 2);
  if (! lpOutputBuffer)
  {
    printf("Echec de l'allocation de la sortie : %ld octets\n", nSize * 2);
    goto free_input_memory;
  }

  /* Lecture du fichier et ajout d'un zéro terminal */
  if (fread(lpInputBuffer, 1, nSize, lpInputFile) != nSize)
  {
    printf("Echec de la lecture du fichier\n");
    goto free_output_memory;
  }
  lpInputBuffer[nSize] = 0;

  nI = 0;
  nJ = 0;
  nK = 0;
  nState = READING_HEADER;
  lpPreviousHeader[0] = 0;
  while (lpInputBuffer[nI])
  {
    switch (lpInputBuffer[nI])
    {
      case '[':
        strcpy(&lpOutputBuffer[nK], LINE_BEGINNING);
        nK += strlen(LINE_BEGINNING);
        break;

      case ']':
        strcpy(&lpOutputBuffer[nK], LINE_ENDING);
        nK += strlen(LINE_ENDING);
        nState = READING_HEADER;        
        break;

      case '\n':
      case '\r':
      case ';':
        break;

      case ' ':
        if (nState == READING_HEADER)
        {
          lpCurrentHeader[nJ] = 0;
          if (strcmp(lpCurrentHeader, lpPreviousHeader))
          {
            sprintf(lpVectorSeparator, "Vector: %s\n", lpCurrentHeader);
            strcpy(&lpOutputBuffer[nK], lpVectorSeparator);
            nK += strlen(lpVectorSeparator);

            strcpy(lpPreviousHeader, lpCurrentHeader);
          }
          nState = READING_VALUES;
          nJ = 0;
        }
        else
        {
          lpOutputBuffer[nK] = ' ';
          nK++;
        }
        break;

      default:
        if (nState == READING_HEADER)
        {
          lpCurrentHeader[nJ] = lpInputBuffer[nI];
          nJ++;
        }
        else
        {
          lpOutputBuffer[nK] = lpInputBuffer[nI];
          nK++;
        }
    }
    nI++;
  }

  /* Lecture du fichier et ajout d'un zéro terminal */
  if (fwrite(lpOutputBuffer, 1, nK, lpOutputFile) != nK)
  {
    printf("Echec de l'écriture du fichier\n");
    goto free_output_memory;
  }

  nResult = 0;
free_output_memory:
  free(lpOutputBuffer);
free_input_memory:
  free(lpInputBuffer);
close_output_file:
  fclose(lpOutputFile);
close_input_file:
  fclose(lpInputFile);
the_end:
  return nResult;
}

lundi 30 novembre 2009 à 16:32:46 | Re : Conversion de vecteurs de test

devc26

Je viens de tester la dernière version avec l'ecriture fichier, mais il y a deux "Vector:" qui s'insèrent: un à la suite de ma conversion hexa--> binaire et l'autre à la fin du vecteur, ça donne ça:

W WaveformVector: RB10CY
V{ANI= 0000000000, 11111111111111111111111111111111Vector: ,
00, 0101010100, 1110111111, 00000000, 0100001000100110, 1, HH11};
Vector:

A ton avis, il est dû à quoi ce "Vector:"?
lundi 30 novembre 2009 à 16:37:26 | Re : Conversion de vecteurs de test

rt15

Membre Club Administrateur CodeS-SourceS
Bin il est là dans mon code :

Code C/C++ :
sprintf(lpVectorSeparator, "Vector: %s\n", lpCurrentHeader);


Mais toi tu n'en as pas besoin sauf erreur.
Je l'avais mis car tu n'avais pas précisé comment était formatée les lignes entre les vecteurs.
Ca correspond plus ou moins à ton "W Waveform" j'imagine.
mardi 1 décembre 2009 à 11:49:45 | Re : Conversion de vecteurs de test

devc26

Oui, c'est vrai, tu as tout à fait raison.

Y aurait-il un moyen d'ouvrir les fichiers à convertir de manière dynamique, c'est-à-dire demander à l'utilisateur d'entrer le nom du fichier qu'il souhaite convertir puis générer de manière automatique le nom du fichier en sortie, par exemple en prenant les 3premiers caractères de fichier d'origine?
mardi 1 décembre 2009 à 13:41:49 | Re : Conversion de vecteurs de test

rt15

Membre Club Administrateur CodeS-SourceS
Oui il y a moyen bien sûr ! Et c'est relativement simple. Tu ne veux pas essayer ?
mardi 1 décembre 2009 à 16:25:53 | Re : Conversion de vecteurs de test

devc26

LOL...c'est exactement ce que je suis entrain de faire. En premier j'avais essayer ça:
string FileName;
cout <<"Enter the name of the file:" <<endl;
cin >> FileName;
lpInputFile = fopen(FileName, "rb");

..jusque là ça va, seulement il faut que je renomme le nouveau fichier avec l'ancien, du coup le FileName ne passe pas dans le fopen, alors j'ai adopté une autre stratégie:j'ai modifié le string FileName en char FileName[30] pour pouvoir faire lpInputFile = fopen(FileName, "w+") et là le compilateur m'annonce: "nResult' : redéfinition ; types de base différents"...donc là je reste perplexe et je tire ma révérence pour les experts en la matière!
mardi 1 décembre 2009 à 16:42:58 | Re : Conversion de vecteurs de test

devc26

..je corrige ma phrase: c'est pour pouvoir faire le lpOutputFile = fopen(FileName, "w+") et non le lpInputFile...autant pour moi

1 2

Cette discussion est classée dans : test, conversion, vecteurs, cy, irb10


Répondre à ce message

Sujets en rapport avec ce message

Conversion d un float [ par Seth ] Comment arrondir un float vers le nombre le plus proche.Exemple : (float)2.8 -> 3 ! (float)2.3 -> 2 turboc++ icones .exe??? [ par idk ] Comment faire pour plus avoir cette icone horrible, (carré blanc avec du bleu en haut!)Dans le makefile faut faire quoi!voici le makefile d'un program Conversion de types de données... [ par nullspace ] J'ai jamais réussis à trouver une bonne solution pour convertir un type de variable dans une autre variable ayant un autre type.Par exemple...si j'ai Demande source en C conversion IEEE754 AU SECOUR!!!!!! [ par Benny54 ] Si vous avez quoi que ce soit sur la conversion IEEE754 en langage C envoyez le moi je suis au bord du GOUFFRE!!!!! source en c conversion Urgent [ par fleur ] je suis super débutante. Je cherche en C un code pour convertir un décimal en hexadécimal.Je vous remercie d'avance pour votre aide...j'en ai vraiment Conversion de type [ par Dlofret ] Bonjour, J'aimerais une façon simple d'afficher une donnée de type float dans un format string. Comment dois-jem m'y prendre ?? Conversion int -> char * [ par Xentor ] Bonjour tout le monde, et merci de lire mon message parce que je suis un vrai débutant !Je voudrais savoir comment convertir un entier en tableau de c Conversion de donnée [ par Johjo ] Salut tout le monde, je cherche à convertir une valeur char en valeur float et inversement de float en char. L'equivalent de Val et Str en basic.Merci Exporter une classe dans une DLL... [ par Clovis ] Salut,Je voudrais pouvoir exporter dans une DLL, si c'est possible, les fonctions et les objets du listing suivant. Car, je voudrais, par la suite pou HEEELLLLPPPP!!!!!!!!!!detruire un handle de com [ par mavric ] salut je fais un prog de com serie ds mon prog j'ouvre une com avec la fonction suivante :hcom=createfile("com2"...........puis je verifie si l'ouvert


Nos sponsors


Sondage...

Comparez les prix

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,295 sec (3)

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