Lire/Ecrire dans un fichier txt, pb, besoin d'aide

eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 9 août 2005 à 17:30
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 10 août 2005 à 12:00
Salut a tous, j'ai un probleme avec une appli que je dois coder.
Je suis un matheux et non un codeur, vous m'excuserez.

J'ai un fichier xml, et je dois extraire les donnees comprises entre certaines balises, puis les importer dans un fichier txt tout simple.
En gros les donnees que je dois extraire sont toujours des nombres (positifs et negatifs) et je dois les importer les un a la suite des autres dans le fichier txt de reception.

Comme je suis pas totalement nul, j'ai deja bien avance.


J'ai utilise un tableau a 2 dimensions, une case pour chaque caractere, dans lequel tous les caracteres du fichier xml sont places(lignes par lignes et caract par caract).
Chaque lignes de mon tab correspond a une ligne du fichier.

J'ai ensuite utilise un second tableau dans lequel j'ai extrait du premier les donnees dont j'ai besoin ( je rappelle que ce sont les caracteres compris entre certains types de balises)

Ainsi j'ai un tableau a 2 dim qui contient exactement les elements que je dois afficher dans mon fic txt.

Mon probleme c'est que mon tableau est de la forme:
char destination[1000][1000];
Et que pour ecrire dans un fichier j'utilise : fprintf qui prend en argument un char*

Alors vous me diriez : utilise un tableau char* pour stocker les donnees
mais je suis oblige d'utiliser un char car j'utilise fgetc() pour recuperer les donnees du fichier initial.

J'ai egalement essaye de caster comme suit:
(char*)destination[i][j]
Ou d'utiliser itoa (car fgetc() retourne un int)
Rien ne marche, toujours la meme erreur ("memory couldn't be read....de mescouiles")

Je suis degoute, car je suis une quiche, mais j'ai qd meme bien avance, je sais exactement ce que je dois faire pour terminer (une double boucle for pour parcourir mon tableau et en afficher le contenu) mais je suis bloque a cause d'une erreur de compatibilite....

Si quelqu'un peut me debloquer, ca serait genial, j'imagine qu'il y a une solution toute simple, que je suis pas le seul a qui s'est arrive...

Merci d'avance

15 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 août 2005 à 18:00
Pour être sur de bien comprendre, j'aimerais bien que tu donne un exemple avec un fichier xml d'entrée, et le txt que tu voudrais qu'il génère
0
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
9 août 2005 à 18:23
...
Pour répondre à la question :
1ère ligne de tont tableau -> destination
2ème ligne -> destination +1000
etc...

La première adresse de ton tableau correspond à destination[0][0].

Donc l'endroit où tu dois récupérer tes données doit correspondre en gros à
fprintf(fichier,"%s",(char *)destination+(1000*numeroligne)).

Si tu n'as pas mis un '\0' après le dernier caractère, y'a des chances pour qu'il aille lire en dehors du tableau...

Quand tu fais un char*destination[i][j], c'est un magnifique tableau de pointeurs...mais il n'a pas de mémoire allouée, du coup, quand tu essayes de lire, il se gauffre.

En dehors de la question : J'ai l'impression que tu te compliques la vie pour pas grand chose...
Si j'ai bien compris, ton fichier doit avoir en gros la tête suivante :

blabla
12345
blabla

donc, dans ta boucle de lecture :
tu récupères la ligne
tu recherches s'il y a une balise de ta liste
s'il y en a une, tu recherches la position de la balise fermante
tu copies ou tu concatènes dans un buffer ce qui se trouve entre la position du dernier caractère de ta balise ouvrante et la première position de ta balise fermante

A la fin de ta boucle de lecture, tu écris la totalité d'un bloc...
Du coup, tu économises des boucles...

Au besoin contacte moi...
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 00:24
Merci d'avoir repondu aussi vite.

EN fait je dois traiter plusieurs fic xml, pour l'instant j'essaye avec un, mais c'est pareil si yen a plusieurs, ils se presentent de la maniere suivante:

<SimValueCubeData>
<ContentDescription>results/VanillaSwaps-1.0</ContentDescription>
<ModelDescription>Cross Asset HJM</ModelDescription>
<Category>Pfe</Category>
<DisplayLabel>Pfe</DisplayLabel>
<DisplayMultiplier>1.</DisplayMultiplier>

MarketData.InterestRate.DiscountCurve.EUR



<SimSpec>
<StepDates>2005-07-28</StepDates>
<StepDates>2005-07-29</StepDates>
<StepDates>2005-07-30</StepDates>
<StepDates>2005-07-31</StepDates>
<StepDates>2005-08-01</StepDates>
<StepDates>2005-08-02</StepDates>
<StepDates>2005-08-03</StepDates>
<StepDates>2005-08-04</StepDates>
<StepDates>2005-08-12</StepDates>
<StepDates>2005-08-27</StepDates>
<StepDates>2005-09-11</StepDates>
<StepDates>2005-09-26</StepDates>
<StepDates>2005-10-12</StepDates>
<StepDates>2005-10-27</StepDates>
<StepDates>2005-11-11</StepDates>
<StepDates>2005-11-26</StepDates>
<StepDates>2005-12-11</StepDates>
<StepDates>2005-12-27</StepDates>
<StepDates>2006-01-11</StepDates>
<StepDates>2006-01-26</StepDates>
<StepDates>2006-02-25</StepDates>
<StepDates>2006-03-28</StepDates>
<StepDates>2006-04-27</StepDates>
<StepDates>2006-05-28</StepDates>
<StepDates>2006-06-27</StepDates>
<StepDates>2006-07-28</StepDates>
<StepDates>2006-08-27</StepDates>
<StepDates>2006-09-26</StepDates>
<StepDates>2006-10-27</StepDates>
<StepDates>2006-11-26</StepDates>
<StepDates>2006-12-27</StepDates>
<StepDates>2007-01-26</StepDates>
<StepDates>2008-04-26</StepDates>
<StepDates>2008-07-27</StepDates>
<StepDates>2008-10-26</StepDates>
....................
<StepDates>2032-07-21</StepDates>
<StepDates>2033-07-21</StepDates>
<StepDates>2034-07-21</StepDates>
<StepDates>2035-07-21</StepDates>
<RunCount>1</RunCount>
0


5


<Seed>0</Seed>
</SimSpec>
<Values>-22.9400220196</Values>
<Values>-15.7788683934</Values>
<Values>-10.1758117733</Values>
<Values>3.8876128095</Values>
<Values>-0.398023237</Values>
<Values>-5.3943060373</Values>
<Values>0.506538714</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>-22.9400220196</Values>
<Values>-10.2391096425</Values>
<Values>-5.0229244988</Values>
<Values>-55.0837858913</Values>
<Values>-122.6711243249</Values>
<Values>-108.6642762044</Values>
<Values>-166.1230032338</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
<Values>0.</Values>
................... ca continue comme ca pendant 500 lignes
</SimValueCubeData>

Donc voila j'ai plusieurs fichier de ce type a traiter et je dois extraire uniquement les données comprises entre les balises <Values>
Toutes ces valeurs sont mises les unes à la suite des autres

Voila un exemple de fichier attendu en sortie(ce n'est pas le ficher correspondant a l'exemple donne juste au dessus ):
7074.172271
5391.820864
8387.310205
15267.56164
21532.51835
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
9334.812255
4148.170259
2487.135171
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
863.805528
202.4335042
226.8111923
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
2124.999157
9387.791606
12892.11033
24064.05988
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
8055.980162
4523.218691
3755.798209
4157.319935
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
4455.415948
17173.05422
13662.63372
38819.09545
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
9367.52481
2539.731005
2394.859022
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
19322.34569
9920.745488
13451.7085
12866.61673
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
7074.172271
8196.833559
3727.176131
6757.298654
0
0
0
0
0
0
0
0
0
0
MNEMONIC Messages postés 59 Date d'inscription dimanche 19 décembre 2004 Statut Membre Dernière intervention 1 septembre 2006
10 août 2005 à 10:12
#include <cstdlib>
#include


using namespace std;


int main(int argc, char *argv[])
{
FILE* fic1 = fopen("fic1.txt","r");
FILE* fic2 = fopen("ficDest.txt","w");
char ligne[500];
char* valW = ligne+8;

if((fic1!=NULL)&&(fic2!=NULL))
{
for(;;)
{
if(fgets(ligne,500,fic1)==NULL)
break;
if(!strncmp(ligne,"<Values>",8))
{
for(int x=8;;x++)
{
if(ligne[x]=='<')
{
ligne[x]='\n';
ligne[x+1]='\0';
break;
}
}
fputs(valW,fic2);
}
}
fclose(fic1);
fclose(fic2);
}
else
{
cout << "erreur d'ouverture des fichiers" << endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 10:28
Merci, c cool d'avoir passer un peu de temps.
Je vais me mettre dessus pour voir, le fichier de destination est vide, ca doit pas etre grand chose...
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 août 2005 à 10:47
Utilise une bibliothèque pour manipuler des fichier xml, ca sera plus simple, plus sur et plus modulable.
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 10:47
Merci Mnemo, en fait ca fonctionne, l'erreur a ete trouve rapidement avec un ptit coup de debugger.
En fait dans mon fichier xml il y a des tabulations, et notemment il y en a une devant chaque balise Values, ce qui fait que lorsqu'il check la ligne et bien elle rentre pas dans la condition car en realite il faut
if(!strncmp(ligne,"\t<Values>",9))
a la place de if(!strncmp(ligne,"<Values>",8))

Il y a encore des ptits details, il affiche egalement "<", enfin bon la c'est cool, dans 5min c fini.

Serieux merci, de mon cote j'avais bien avance et je m'etais bien debloque ce matin, je pense que j'aurais un truc propre avec un peu de taf, mais ton code est bcp plus simple que le mien.

Merci
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 10:50
Je connais pas de biblio qui gere les doc xml
Je vais chercher
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 10:52
MinXL ? ... ok je sors ;-) Regarde dans mes sources....
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 11:27
Ta biblio semble bien complete
J'arrive pas a la compiler, je regarderais mieux plutard, car je me sers pas mal de xml dans mon taf.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
10 août 2005 à 11:28
Pourquoi MinXML n'est pas sur sourceforge ?



eupeup > Des bibliothèque en C pour xml il y en a pour tout les gouts.

Fais une recherche sur sourceforge.net http://sourceforge.net/
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 11:39
Le terme exact est MinXL (pas MinXML).

MinXL vient de Min(imalist) Xml Library

Tu trouveras MinXL sur SF, le CVS est a jour normalement.

Pour la compilation, il faut un compilo C++ qui se respecte.
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 11:53
Je l'ai bien trouve, mais je compile avec VS6, je sais pas pourquoi ca compile pas, j'essayerai de voir ...

Sinon merci, ca ma bien debloque
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
10 août 2005 à 11:58
Si tu as un probleme avec la compilation de MinXL, bascule sur les message du source MinXL.... je t'aiderai à configurer (cette daube de) VC6 pour compiler du C++ standard.
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
10 août 2005 à 12:00
Ok thanks
0
Rejoignez-nous