Accueil > Forum > > > > Conversion de vecteurs de test
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
|
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
|
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
|
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
|
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
|
|
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
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|