OVH Cloud OVH Cloud

bc++ transtypage srtuct > char et char >struct

8 réponses
Avatar
fontaine jean paul
bonjour
je voudrais transtyper un char buf[89] en une stucture
de types recettes appelée re
voici le code mais je n'arrive pas a faire fonctionner dynamic_cast
je suis tres nouveau en la matiére

voici le code de la fonction que j'aimerais faire fonctionner

void quedesnombres(char * recettesaouvrir)
//je declare mes variables
{
struct recettes
{
char daterecet[18];
char titre[9];
float tva0,tva6,tva21;
}re;
char buf[39];
int tour=0,longueur=0,debuttour=0;

//j'ouvre le fichier

recettesaouvrir="c:\\comptae\\transit\\rec0803";
fstream rec ;
rec.open (recettesaouvrir);
rec.seekg(0,ios::end);
longueur=rec.tellg();
if (rec.is_open())
else
ShowMessage(AnsiString("n'existe pas ")+BoolToStr(rec.is_open));

rec.seekg(0,ios::beg);

while (tour<longueur)

{
rec.get(buf[39]);

//j'ai donc la un char de longueur 39 que je voudrais transtyper en
struct re
j'ai chercher avec dynamic_cast mais il y a quelque chose qui m'echappe
et je n'y arrive pas

merci de votre reponse
jean paul fontaine

8 réponses

Avatar
kanze
fontaine jean paul wrote in message
news:<403d1ff3$0$13858$...

je voudrais transtyper un char buf[89] en une stucture de types
recettes appelée re voici le code mais je n'arrive pas a faire
fonctionner dynamic_cast. je suis tres nouveau en la matiére

voici le code de la fonction que j'aimerais faire fonctionner

void quedesnombres(char * recettesaouvrir)
//je declare mes variables
{
struct recettes
{
char daterecet[18];
char titre[9];
float tva0,tva6,tva21;
}re;
char buf[39];
int tour=0,longueur=0,debuttour=0;

//j'ouvre le fichier

recettesaouvrir="c:comptaetransitrec0803";
fstream rec ;
rec.open (recettesaouvrir);
rec.seekg(0,ios::end);
longueur=rec.tellg();
if (rec.is_open())
else
ShowMessage(AnsiString("n'existe pas ")+BoolToStr(rec.is_open));

rec.seekg(0,ios::beg);

while (tour<longueur)

{
rec.get(buf[39]);

//j'ai donc la un char de longueur 39 que je voudrais transtyper en
struct re
j'ai chercher avec dynamic_cast mais il y a quelque chose qui
m'echappe et je n'y arrive pas


Je ne suis pas très sûr d'avoir compris ce que tu veux réelement.
D'abord, est-ce qu'il s'agit de récupérer des données déjà écrites dans
un format défini, ou est-ce que c'est toi qui définis le format ? En
tout cas, il faut savoir le format exact des données externes, et ce
n'est pas une struct qui va t'aider là.

Aussi, d'où vient ce 39 ? J'ai l'impression que tu as simplement ajouté
la taille de chacune des champs dans recettes -- ça ne marche pas comme
ça, ni en interne, ni en externe.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
fontaine jean paul
merci
en quelques mots j'ai ecris en quick basic voila longtemps
un programme de comptabilite qui se servait de stucture
d'enregistrements de longueur fixe soit 39 octets pour l'exemple ci dessus
comme je voudrais reprogrammer en c++ mais employer la meme longueur
d'enregistrement soit 39 pour exploiter mes anciens fichier il faudrai
que je puisse extraire les donnees de 39 octets dans une structure les
manipuler puis les reinscrire avec la meme longueur
si c'est possible comment faire avec fstream
jean paul fontaine


wrote:

fontaine jean paul wrote in message
news:<403d1ff3$0$13858$...


je voudrais transtyper un char buf[89] en une stucture de types
recettes appelée re voici le code mais je n'arrive pas a faire
fonctionner dynamic_cast. je suis tres nouveau en la matiére



voici le code de la fonction que j'aimerais faire fonctionner



void quedesnombres(char * recettesaouvrir)
//je declare mes variables
{
struct recettes
{
char daterecet[18];
char titre[9];
float tva0,tva6,tva21;
}re;
char buf[39];
int tour=0,longueur=0,debuttour=0;



//j'ouvre le fichier



recettesaouvrir="c:comptaetransitrec0803";
fstream rec ;
rec.open (recettesaouvrir);
rec.seekg(0,ios::end);
longueur=rec.tellg();
if (rec.is_open())
else
ShowMessage(AnsiString("n'existe pas ")+BoolToStr(rec.is_open));



rec.seekg(0,ios::beg);



while (tour<longueur)



{
rec.get(buf[39]);



//j'ai donc la un char de longueur 39 que je voudrais transtyper en
struct re
j'ai chercher avec dynamic_cast mais il y a quelque chose qui
m'echappe et je n'y arrive pas



Je ne suis pas très sûr d'avoir compris ce que tu veux réelement.
D'abord, est-ce qu'il s'agit de récupérer des données déjà écrites dans
un format défini, ou est-ce que c'est toi qui définis le format ? En
tout cas, il faut savoir le format exact des données externes, et ce
n'est pas une struct qui va t'aider là.

Aussi, d'où vient ce 39 ? J'ai l'impression que tu as simplement ajouté
la taille de chacune des champs dans recettes -- ça ne marche pas comme
ça, ni en interne, ni en externe.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
Gourgouilloult

en quelques mots j'ai ecris en quick basic voila longtemps
un programme de comptabilite qui se servait de stucture
d'enregistrements de longueur fixe soit 39 octets pour l'exemple ci dessus
comme je voudrais reprogrammer en c++ mais employer la meme longueur
d'enregistrement soit 39 pour exploiter mes anciens fichier il faudrai
que je puisse extraire les donnees de 39 octets dans une structure les
manipuler puis les reinscrire avec la meme longueur
si c'est possible comment faire avec fstream
jean paul fontaine


(Bon, je fais une réponse à 0.2 euros.) La façon basique de lire un
fstream, quand on a des contraintes a priori de l'ordre de l'octet (1)
est d'utiliser get() pour récupérer la donnée dans des chars et faire
les conversions à partir de ces chars vers les types adéquats. En tout
cas, c'est le genre de situation où il vaut mieux ne pas chercher à être
trop malin !

(1) Note pour les pinailleurs : bon, c'est certainement pas du
vocabulaire en rapport avec la norme, mais on va supposer que ce
monsieur ne code pas sur pdp et a ses chars codés sur des octets de 8
bits «comme tout le monde», et qu'il ne s'occupe pas pour l'instant des
questions de portabilité ;)

Gourgou
(Et non, je ne suis même pas certain que les pdp avaient des bytes de
pas 8 bits, patapay)

Avatar
fontaine jean paul
c'est exactement ce que j'ai fait
comme c'est un programme ne devant pas etre portable
et que mes contraintes etait de cette ordre
char sur 8 bits pas de pdp
ps: j'ai prefere read à get

merci de ta réponse
jean paul fontaine

Gourgouilloult wrote:



en quelques mots j'ai ecris en quick basic voila longtemps
un programme de comptabilite qui se servait de stucture
d'enregistrements de longueur fixe soit 39 octets pour l'exemple ci
dessus
comme je voudrais reprogrammer en c++ mais employer la meme longueur
d'enregistrement soit 39 pour exploiter mes anciens fichier il faudrai
que je puisse extraire les donnees de 39 octets dans une structure les
manipuler puis les reinscrire avec la meme longueur
si c'est possible comment faire avec fstream
jean paul fontaine



(Bon, je fais une réponse à 0.2 euros.) La façon basique de lire un
fstream, quand on a des contraintes a priori de l'ordre de l'octet (1)
est d'utiliser get() pour récupérer la donnée dans des chars et faire
les conversions à partir de ces chars vers les types adéquats. En tout
cas, c'est le genre de situation où il vaut mieux ne pas chercher à être
trop malin !

(1) Note pour les pinailleurs : bon, c'est certainement pas du
vocabulaire en rapport avec la norme, mais on va supposer que ce
monsieur ne code pas sur pdp et a ses chars codés sur des octets de 8
bits «comme tout le monde», et qu'il ne s'occupe pas pour l'instant des
questions de portabilité ;)

Gourgou
(Et non, je ne suis même pas certain que les pdp avaient des bytes de
pas 8 bits, patapay)




Avatar
Jean-Marc Bourguet
Gourgouilloult <gourgou_at_club-internet_point_fr> writes:

(Et non, je ne suis même pas certain que les pdp avaient des bytes
de pas 8 bits, patapay)


Tout depend de quel PDP tu parles.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Gourgouilloult

(Et non, je ne suis même pas certain que les pdp avaient des bytes
de pas 8 bits, patapay)


Tout depend de quel PDP tu parles.


Erf, c'est justement ce qu'il me semblait. J'ai préféré pas trop
m'avancer non plus ;) (quoique c'était déjà pas mal)

Gourgou


Avatar
James Kanze
fontaine jean paul writes:

|> en quelques mots j'ai ecris en quick basic voila longtemps un
|> programme de comptabilite qui se servait de stucture
|> d'enregistrements de longueur fixe soit 39 octets pour l'exemple ci
|> dessus comme je voudrais reprogrammer en c++ mais employer la meme
|> longueur d'enregistrement soit 39 pour exploiter mes anciens fichier
|> il faudrai que je puisse extraire les donnees de 39 octets dans une
|> structure les manipuler puis les reinscrire avec la meme longueur si
|> c'est possible comment faire avec fstream

Pour commencer, il faudrait savoir exactement le format de ces 39
octets. Ensuite, s'ils contiennent du binaire, il ne faut pas oublier
d'ouvrir le fichier en mode binaire. Puis, avec get, on peut le lire
octet par octet, pour réconstituer les données.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
fontaine jean paul writes:

|> c'est exactement ce que j'ai fait comme c'est un programme ne devant
|> pas etre portable et que mes contraintes etait de cette ordre char
|> sur 8 bits pas de pdp

Je crois qu'il a ajouté celà simplement pour prévenir qu'il se
rendait compte des limitations de sa suggestion. Il y a eu des machines
aux « bytes » à 9 bits dans la passée, mais je crois qu'en
dehors de certains gros Unisys, il n'y en a plus, et la plupart des gens
n'ont pas réelement besoin de les prendre en compte.

En revanche, il ne faut pas oublier que le format des virgule flottants
est encore loin d'être normalisé, et que la tailles des int et des
long, comme l'ordre des octets, varient encore même parmi les
machines les plus courantes.

|> ps: j'ai prefere read à get

Pourquoi ? Qu'est-ce que ça change ? Quoique tu fasses, il faut que
tu traites octet par octet pour réconstituer la structure voulue. Au
moins qu'il faut traiter bit par bit, ce qui peut arriver plus souvent
qu'on veut quand on a affaire à des virgules flottants.

Pour l'instant, tu nous as toujours rien dit sur le format des
données qui se trouvent dans le fichier. Donc, nous ne pouvons rien
dire de concret sur la façon de les lire.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93