Conversion de vecteurs de test

Signaler
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010
-
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010
-
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.

19 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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...).

#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;
}
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

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;
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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).

#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;
}

Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

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:"?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Bin il est là dans mon code :

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.
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

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?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Oui il y a moyen bien sûr ! Et c'est relativement simple. Tu ne veux pas essayer ?
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

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!
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

..je corrige ma phrase: c'est pour pouvoir faire le lpOutputFile = fopen(FileName, "w+") et non le lpInputFile...autant pour moi
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Bôh, là c'est pas franchement du code pour les experts... C'est plutôt d'excellent exos pour débutants.

Tu devrais apprendre le C, tu arriverais relativement vite à ce résultat ! Tu as par exemple un cours ici + l'aide de la lib standard de mon lien plus haut, et tu as déjà de quoi bien te défendre.

Cela dit essaie de ne pas mélanger le C pur (Comme mon code) et le C++ (cin >>, cout <<). Quand on débute, mieux vaut se concentrer sur le C (Le C++ est globalement une extension du C).

Voilà un bout d'exemple.

int main()
{
  char lpInputFileName[200];
  char lpOutputFileName[200];
  char* lpExtension;
  int nExtensionPos;
  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;

  puts("Entrez le nom du fichier à convertir");
  scanf("%s", lpInputFileName);

  /* Génération du nom du fichier de sortie : NomFic_output.ExtFic */
  strcpy(lpOutputFileName, lpInputFileName);
  lpExtension = strrchr(lpOutputFileName, '.');
  if (lpExtension)
  {
    nExtensionPos = (int)(lpExtension - lpOutputFileName);
    lpOutputFileName[nExtensionPos] = 0;
  }
  strcat(lpOutputFileName, "_output");
  if (lpExtension)
    strcat(lpOutputFileName, &lpInputFileName[nExtensionPos]);

  /* Ouverture des fichiers */
  lpInputFile = fopen(lpInputFileName, "rb");
  if (! lpInputFile)
  {
    printf("Echec de l'ouverture du fichier %s\n", lpInputFileName);
    goto the_end;
  }
  lpOutputFile = fopen(lpOutputFileName, "w+");
  if (! lpOutputFile)
  {
    printf("Echec de l'ouverture du fichier %s\n", lpOutputFileName);
    goto close_input_file;
  }
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

ça y est; Eureka! ça fonctionne. En fait j'avais mis une virgule au lieu d'un point virgule ...

Je te remercie beaucoup d'avoir partager tes connaissances et de m'avoir aider;
..quand on passe de LabView au C++ on s'en fait des cheveux blancs! (même pour un innocent traitement de texte)
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

Merci pour le lien.
Suite à la conversion, le vecteur est de cette forme:

W RB10_CY; V{ALL= 0000000000;111111111111111111111111111111110001010101101110111111 00000000010000100010011011111};

ça n'est toujours pas bon car il y une virgule qui s'insère entre le 0 et 1 et il faudrait convertir les 8 zéros héxa (aprés l'espace)en binaire tout en enlevant l'espace. Ce qui est délicat c'est comment ne pas confondre les zéros binaires en début du vecteur des zéros héxa situés toujours aprés l'espace?
D'aprés la doc, je pensais utiliser un fseek pour pouvoir les remplacer à cette même position dans tous les vecteurs.Est-ce une bonne chose?
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Gné ?

J'ai rien compris...

Cela dit, si tu utilises mon code tu n'as pas du tout besoin de fseek vu que tout est chargé en mémoire.

D'autre part attention : tu ne peux pas insérer dans un fichier. Ou du moins pas sans décaler manuellement toute la suite du fichier !
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

^^
Pour résumer il faut ajouter des zéros dans le vecteur à des endroits bien précis.
je ne savais pas qu'on ne pouvait pas insérer dans le fichier.Le fichier ne doit justement pas être retouché manuellement...
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Quand je dis manuellement, c'est par code.

Si tu fais fseek, puis fwrite, tu n'insère pas, tu écrase. Pour insérer, il faut décaler toute la suite du fichier.

Voilà du pseudo code pour insérer "truc à insérer" de taille "taille" à l'offset "position" :
lit(buffer, position, fin du fichier - position)
écrit(buffer, position + taille, fin du fichier - position)
écrit(truc à insérer, position, taille)


Et c'est le même principe qu'il faut appliquer pour insérer dans un tampon en mémoire. Sans oublier qu'il faut s'assurer que celui-ci est suffisamment grand.

Si tu veux écraser dans le tampon, c'est très simple par contre. Pour remplacer un caractère à la position i :
lpInputBuffer[i] = 't';

Mais quoiqu'il arrive, cela m'étonnerait que tu sois vraiment obligé de modifier les données du fichier d'entrée pour pouvoir le lire.

Si tu peux savoir comment le modifier, tu dois aussi pouvoir le lire sans le modifier. Peut être en rajoutant une valeur pour nState par exemple.
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

ok, merci, je vais essayer de cette manière.
Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

J'ai essayé d'appliquer ce que tu m'as dis mais sans succés.
En prenant pour exemple le vecteur ci-dessous, les champs 2et7 sont en héxadécimal et doivent être transformés en binaire (champ 2 =0000ffff,champ 7=fe000000). les zéros ne sont pas convertis ce qui fait que je n'ai pas 32bits au final dans chacun de ces deux champs.

Comment fais-tu, à partir de ton programme pour pouvoir convertir ces champs correctement sachant que l'on peut avoir n'importe quelle valeur héxadécimale dans les champs 2 et 7?

V{All= 0000000000, 0000ffff, 10, 55, 10, 1110111111, fe000000, 0000001000100110, 1, HL11;}
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
Bin on peut par exemple compter les ',' pour savoir dans quel champ on est.

#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"

char* HexToBin(char nLetter)
{
  switch (nLetter)
  {
    case '0':
      return "0000";
    case '1':
      return "0001";
    case '2':
      return "0010";
    case '3':
      return "0011";
    case '4':
      return "0100";
    case '5':
      return "0101";
    case '6':
      return "0110";
    case '7':
      return "0111";
    case '8':
      return "1000";
    case '9':
      return "1001";
    case 'a':
      return "1010";
    case 'b':
      return "1011";
    case 'c':
      return "1100";
    case 'd':
      return "1101";
    case 'e':
      return "1110";
    case 'f':
      return "1111";
    default:
      return "err ";
  }
}

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

  nResult = 1;

  puts("Entrez le nom du fichier à convertir");
  scanf("%s", lpInputFileName);

  /* Génération du nom du fichier de sortie : NomFic_output.ExtFic */
  strcpy(lpOutputFileName, lpInputFileName);
  lpExtension = strrchr(lpOutputFileName, '.');
  if (lpExtension)
  {
    nExtensionPos = (int)(lpExtension - lpOutputFileName);
    lpOutputFileName[nExtensionPos] = 0;
  }
  strcat(lpOutputFileName, "_output");
  if (lpExtension)
    strcat(lpOutputFileName, &lpInputFileName[nExtensionPos]);

  /* Ouverture des fichiers */
  lpInputFile = fopen(lpInputFileName, "rb");
  if (! lpInputFile)
  {
    printf("Echec de l'ouverture du fichier %s\n", lpInputFileName);
    goto the_end;
  }
  lpOutputFile = fopen(lpOutputFileName, "w+");
  if (! lpOutputFile)
  {
    printf("Echec de l'ouverture du fichier %s\n", lpOutputFileName);
    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 ',':
        lpOutputBuffer[nK] = ',';
        nK++;
        nField++;
        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;
          nField = 1;
          nJ = 0;
        }
        else
        {
          lpOutputBuffer[nK] = ' ';
          nK++;
        }
        break;

      default:
        if (nState == READING_HEADER)
        {
          lpCurrentHeader[nJ] = lpInputBuffer[nI];
          nJ++;
        }
        else
        {
          if ((nField 2) || (nField 7))
          {
            strcpy(&lpOutputBuffer[nK], HexToBin(lpInputBuffer[nI]));
            nK += 4;
          }
          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;
}

Messages postés
14
Date d'inscription
vendredi 20 novembre 2009
Statut
Membre
Dernière intervention
12 février 2010

ça fonctionne , merci