C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

fstream vs fopen ?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Bernie
Guest





PostPosted: Fri Jun 24, 2005 10:33 am    Post subject: fstream vs fopen ? Reply with quote



Bonjour,
j'ai un prb de compréhension des relation et équivalence entre des codes
utilisant des fstream et ceux utilisant des fopen ....

en bref, j'ai une routine qui parse un fichier via un code du type :
fstream fs;
fs.open(nomfichier, ios_base::in)
fs.seekg(i);//i un offset qui est donnée par la dll qui a écrit le fichier
puis une boucle jusqu'à la fin avec des getline...

L'existence de ce fichier est temporaire et sera + tard remplacer par
une mémoire partagée entre la DLL et mon application. Donc pour préparer
le terrain, je veux parser mon ficher après l'avoir intégralement chargé
en memoire via :

FILE* pf = fopen(monfichier, "rt")
struct _stat file_info = _stat(monfichier);
allocation(Buffer, file_info.size);
fread(Buffer, 1, file_info.size, pf);
puis parser Buffer en ce décalant de l'offset...

cependant l'offset i ne semble pas avoir de sens, ou en tout pas le sens
d'un offset en octet à partir du debut de fichier ... Je suspose que si
le fichier est ecris via un fstream, puis lu via un fstream tout est
cohérent, mais dans le cas contraire, comme assurer la conversion de
l'offset pour un fs.seekg en un offset octet pour positionner le
pointeur de debut de parsing dans mon buffer ?

Auriez vous des infos sur ce sujet.
merci d'avance
Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Jun 24, 2005 4:13 pm    Post subject: Re: fstream vs fopen ? Reply with quote



Bernie wrote:

Quote:
j'ai un prb de compréhension des relation et équivalence entre
des codes utilisant des fstream et ceux utilisant des fopen
....

Il doit y avoir équivalence exacte, parce que tous les
comportements des fstream sont définis en termes des FILE*.

Quote:
en bref, j'ai une routine qui parse un fichier via un code du type :
fstream fs;
fs.open(nomfichier, ios_base::in)
fs.seekg(i);//i un offset qui est donnée par la dll qui a écrit le fichier
puis une boucle jusqu'à la fin avec des getline...

Attention, déjà : un seekg à une position arbitraire n'est
garanti que si la position provient du résultat d'un tellg
précédant. C'est assez limité, ce qu'on peut faire avec les
accès aléatoire sur les flux (que ce soit les flux de C++ ou les
flux de C, d'ailleurs).

Quote:
L'existence de ce fichier est temporaire et sera + tard
remplacer par une mémoire partagée entre la DLL et mon
application. Donc pour préparer le terrain, je veux parser mon
ficher après l'avoir intégralement chargé en memoire via :

FILE* pf = fopen(monfichier, "rt")

C'est quoi, cette option 't'. Elle n'existe pas dans la norme C,
et je ne l'ai jamais vu.

Quote:
struct _stat file_info = _stat(monfichier);
allocation(Buffer, file_info.size);
fread(Buffer, 1, file_info.size, pf);
puis parser Buffer en ce décalant de l'offset...

cependant l'offset i ne semble pas avoir de sens, ou en tout
pas le sens d'un offset en octet à partir du debut de fichier
...

Puisque tu parles des DLL, et _stat, je supposerais une
plateforme Windows. Alors : d'où vient réelement cette valeur
i ? Parce que de toute façon, si le fichier n'est pas ouvert en
binaire, la notion de « offset en octet » n'a pas de sens.
Si le DLL a fait un tellg lors qu'il a écrit, et que c'est cette
valeur-là qu'elle indique, il y a des chances que ça marche de
ton côté, toujours à condition d'ouvrir le fichier avec la même
mode.

Dans la mesure où tu veux te rapprocher de mmap autant que
possible, je conseillerai d'ouvrir des deux côtés en mode
binaire. Comme ça, tu as une image. Et si tu n'as pas
d'influence sur la DLL, et elle écrit en texte, il est peut
probable que tu puisses réelement utiliser mmap ; au moins, tu
n'y verras pas les mêmes octets que l'autre a écrit.

Quote:
Je suspose que si le fichier est ecris via un fstream, puis lu
via un fstream tout est cohérent, mais dans le cas contraire,
comme assurer la conversion de l'offset pour un fs.seekg en un
offset octet pour positionner le pointeur de debut de parsing
dans mon buffer ?

Ce qu'on peut faire avec les offsets est assez limité, au moins
en ce qui concerne la norme. Mais typiquement, si tu travailles
en mode binaire des deux côtés, tu as des chances de pouvoir
t'en sortir.

Ce qui vaut aussi bien pour les flux iostream que pour les flux
FILE*.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
Alexandre
Guest





PostPosted: Fri Jun 24, 2005 6:52 pm    Post subject: Re: fstream vs fopen ? Reply with quote




Quote:
C'est quoi, cette option 't'. Elle n'existe pas dans la norme C,
et je ne l'ai jamais vu.

j'avais vu ça sur les compilos borland (et je suppose, la plupart des
compilos pour DOS/Win) : mode texte (à opposer à 'b' pour mode binaire), ce
qui ne change que les ajout de r après les n (ou l'inverse, d'ailleurs).
ça ne doit pas exister sous unix (donc pas dans la norme je suppose)





Back to top
Fabien LE LEZ
Guest





PostPosted: Sun Jun 26, 2005 3:27 pm    Post subject: Re: fstream vs fopen ? Reply with quote

On 24 Jun 2005 09:13:05 -0700, [email]kanze (AT) gabi-soft (DOT) fr[/email]:

Quote:
FILE* pf = fopen(monfichier, "rt")

C'est quoi, cette option 't'. Elle n'existe pas dans la norme C,
et je ne l'ai jamais vu.

Elle indique que le fichier est ouvert en mode texte. Et comme c'est
de toutes façons le mode par défaut, c'est une no-op.


Back to top
Horst Kraemer
Guest





PostPosted: Sun Jun 26, 2005 8:00 pm    Post subject: Re: fstream vs fopen ? Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:

Quote:

FILE* pf = fopen(monfichier, "rt")

C'est quoi, cette option 't'. Elle n'existe pas dans la norme C,
et je ne l'ai jamais vu.

C'est une extension (très inutile Wink inventée probablement par
Borland ou Microsoft. Sous Turbo C et successeurs on avait l'option de
définir (par une variable publique de la bibliothèque) "binaire" comme
défaut. Alors il fallait "rt" pour indiquer qu'on veut ouvrir le
fichier en mode texte.

--
Horst


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.