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 

la valeur pointé par un FILE* est-elle intéressante?

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





PostPosted: Sat May 14, 2005 9:01 am    Post subject: la valeur pointé par un FILE* est-elle intéressante? Reply with quote



Bonjour,
Dans l'un de mes "programmes", j'écris dans un fichier toujours au même
endroit, toujours le même nombre de caractères (en utilisant
cstdio/stdio.h).
Pour ce faire, j'utilise fseek avant chaque nouvelle écriture.
J'aimerais savoir si il y a un moyen de contourner cet appel à fseek (dans
un souci de gain de temps) en utilisant par exemple la valeur pointée par
mon FILE* flux (donc en gros si *flux est une strucutre utilisable et si le
code

FILE *flux_orig;
FILE *flux_dest;
fseek(flux_orig, là_où_je_veux, SEEK_SET);
*flux_dest = *flux_orig;
(flux_dest, "ce que je veux écrire");
*flux_dest = *flux_orig;
fprintf(flux_dest, "quelquechose d'autre.")

va d'abord m'écrire "ce que je veux écrire" là où je veux, puis réécrire par
dessus "quelquechose d'autre")?
Merci d'avance
Miguel


Back to top
Emmanuel Delahaye
Guest





PostPosted: Sat May 14, 2005 9:44 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote



Miguel wrote on 14/05/05 :
Quote:
Dans l'un de mes "programmes", j'écris dans un fichier toujours au même
endroit, toujours le même nombre de caractères (en utilisant cstdio/stdio.h).
Pour ce faire, j'utilise fseek avant chaque nouvelle écriture.

Ah ? Si tu créées un nouveau fichier (effaces les anciennes données),
tu n'as rien à faire d'autre que fopen() avec "w".

Quote:
J'aimerais savoir si il y a un moyen de contourner cet appel à fseek (dans un
souci de gain de temps)

Si tu en as réellement besoin, non.

en utilisant par exemple la valeur pointée par mon
Quote:
FILE* flux (donc en gros si *flux est une strucutre utilisable et si le code

Non, pas du tout. Le pointeur FILE * est une adresse anonyme sur un
bloc interne de gestion du fichier dont les détails ne sont ni
spécifiés ni forcément accessibles[1].


------------------
[1] Dans <stdio.h>, il pourrait très bien y avoir un

typedef struct file FILE;

et le tour est joué.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

..sig under repair


Back to top
Miguel
Guest





PostPosted: Sat May 14, 2005 10:34 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote



Quote:
Dans l'un de mes "programmes", j'écris dans un fichier toujours au même
endroit, toujours le même nombre de caractères (en utilisant
cstdio/stdio.h).
Pour ce faire, j'utilise fseek avant chaque nouvelle écriture.

Ah ? Si tu créées un nouveau fichier (effaces les anciennes données), tu
n'as rien à faire d'autre que fopen() avec "w".
ouais, mais il n'y a pas que ce que je veux écrire dedans, je l'ouvre en

"r+t", je veux juste modifier 7 carctères.

Quote:
J'aimerais savoir si il y a un moyen de contourner cet appel à fseek
(dans un souci de gain de temps)

Si tu en as réellement besoin, non.
Bon, bah tant pis alors... :'(


Quote:
en utilisant par exemple la valeur pointée par mon
FILE* flux (donc en gros si *flux est une strucutre utilisable et si le
code

Non, pas du tout. Le pointeur FILE * est une adresse anonyme sur un bloc
interne de gestion du fichier dont les détails ne sont ni spécifiés ni
forcément accessibles[1].


------------------
[1] Dans <stdio.h>, il pourrait très bien y avoir un

typedef struct file FILE;

et le tour est joué.

Merci pour ces infos, je pensais qu'il y avait une norme précise sur la
définition du FILE*...



Back to top
Miguel
Guest





PostPosted: Sat May 14, 2005 10:37 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

Désolé pour la grammaire
la valeur pointéE par un FILE* est-elle intéressante?


Back to top
gregg
Guest





PostPosted: Sat May 14, 2005 10:54 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

Miguel wrote:

Quote:
ouais, mais il n'y a pas que ce que je veux écrire dedans, je l'ouvre en
"r+t", je veux juste modifier 7 carctères.

"r+t" ???

++


Back to top
Pierre Maurette
Guest





PostPosted: Sat May 14, 2005 11:29 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

Miguel, le 14/05/2005, a écrit :
Quote:
Bonjour,
Dans l'un de mes "programmes", j'écris dans un fichier toujours au même
endroit, toujours le même nombre de caractères (en utilisant cstdio/stdio.h).
Pour ce faire, j'utilise fseek avant chaque nouvelle écriture.
J'aimerais savoir si il y a un moyen de contourner cet appel à fseek (dans un
souci de gain de temps) en utilisant par exemple la valeur pointée par mon
FILE* flux (donc en gros si *flux est une strucutre utilisable et si le code

FILE *flux_orig;
FILE *flux_dest;
Comment les initialisez-vous ? Un fopen() pour le premier, le même ou

un malloc(sizeof(FILE)) pour le second ?


Quote:
fseek(flux_orig, là_où_je_veux, SEEK_SET);
*flux_dest = *flux_orig;
ou

memcpy(flux_dest, flux_orig, sizeof(FILE));


Quote:
(flux_dest, "ce que je veux écrire");
manque un fprintf, non ?


Quote:
*flux_dest = *flux_orig;
fprintf(flux_dest, "quelquechose d'autre.")
;

J'imagine que vous êtes étudiant et n'avez pas de machine à
disposition. Sinon, postez du code compilable, c'est mieux et des fois
ça répond à la question.

Quote:
va d'abord m'écrire "ce que je veux écrire" là où je veux, puis réécrire par
dessus "quelquechose d'autre")?

(Attention, réponse sans conviction ni certitude, mais comme c'est le
week-end...)
Sans parler du danger qu'il y a à chercher à piéger le sysytème, votre
truc ne peut pas fonctionner à mon avis.
Un point de la norme:
<$7.19.3.6>
The address of the FILE object used to control a stream may be
significant; a copy of a FILE object need not serve in place of the
original.
</$7.19.3.6>
Ça veut dire que, comme pour le couple malloc()/free(), la valeur du
pointeur renvoyé joue un rôle de clé d'identification. Par exemple si
vous laissez mourrir dans une fonction un pointeur renvoyé par malloc()
ou fopen(), vous ne pouvez plus faire free() ou fclose().
Rien ne dit que l'état du fichier est entièrement contenu dans l'objet
FILE. Cet objet (petit sur ma machine, il fait 24 char) peut très bien
ne pas contenir la position courante, celle-ci étant connue au travers
de la valeur du FILE*.
Voyez plutôt les fonctions fgetpos() et fsetpos(). Encore que je ne
pense pas qu'un appel à fseek() soit si coûteux que ça, surtout le
second et les suivants ...

--
Pierre


Back to top
Targeur fou
Guest





PostPosted: Sat May 14, 2005 5:36 pm    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote


Miguel a écrit :
Quote:
Désolé pour la grammaire
la valeur pointéE par un FILE* est-elle intéressante?

Que veux tu dire par là ? FILE est une structure et FILE * un pointeur
(qui t'es donné directement par appel de fopen(), tmpfile() ou
freopen() qui sont des fonction de la libc). Ce que te propose
l'interface de la libc, c'est de manipuler des FILE *, pas des FILE. La
valeur pointée par un FILE * est une structure interne qu'il serait
dangereux de modifier. Il y a peut être des membres de FILE nommés
ptr ou offset par exemple, mais qui va te dire que c'est le décalage
par rapport au début du fichier ou le décalage par rapport au début
du tampon de lecture/écriture utilisé.

Regis


Back to top
Antoine Leca
Guest





PostPosted: Mon May 16, 2005 8:55 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

En <news:4285d4f3$0$23872$626a14ce (AT) news (DOT) free.fr>, Miguel va escriure:
Quote:
la valeur pointéE par un FILE* est-elle intéressante?

Je ne sais pas si c'est la question, mais il faut savoir que parfois la
valeur (l'adresse) du pointeur FILE* peut être signifiante; certaines
implémentations ont du code qui lis une chaîne connue de structures FILE
(par exemple pour fermer les fichiers à la fin du programme), et donc si tu
déplace ailleurs la structure pointée, cela ne fonctionne plus.


Antoine


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon May 16, 2005 11:38 am    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

Pierre Maurette wrote:
Quote:
Miguel, le 14/05/2005, a écrit :

Dans l'un de mes "programmes", j'écris dans un fichier
toujours au même endroit, toujours le même nombre de
caractères (en utilisant cstdio/stdio.h). Pour ce faire,
j'utilise fseek avant chaque nouvelle écriture. J'aimerais
savoir si il y a un moyen de contourner cet appel à fseek
(dans un souci de gain de temps) en utilisant par exemple la
valeur pointée par mon FILE* flux (donc en gros si *flux est
une strucutre utilisable et si le code

FILE *flux_orig;
FILE *flux_dest;

Comment les initialisez-vous ? Un fopen() pour le premier, le
même ou un malloc(sizeof(FILE)) pour le second ?

Ce n'est pas garantie que malloc(sizeof(FILE)) compile. Le type
FILE n'est pas forcement complet. (Je crois même qu'il peut être
void, mais je ne suis pas sûr.)

Quote:
fseek(flux_orig, là_où_je_veux, SEEK_SET);
*flux_dest = *flux_orig;

ou
memcpy(flux_dest, flux_orig, sizeof(FILE));

Comme ci-dessus.

Le même vaut pour l'affectation, aussi.

Aussi, j'ai mes doutes quant à la légalité d'une expression du
genre *unFile. Là non plus, je ne suis pas 100% sûr, mais je
crois qu'une implémentation pourrait bien mettre des entiers
arbitraires dedans, et non de véritables pointeurs. C-à-d donc
que le code pourrait se compiler, mais provoquer un core lors de
l'exécution.

Quote:
(flux_dest, "ce que je veux écrire");
manque un fprintf, non ?

*flux_dest = *flux_orig;
fprintf(flux_dest, "quelquechose d'autre.") ;

J'imagine que vous êtes étudiant et n'avez pas de machine à
disposition. Sinon, postez du code compilable, c'est mieux et
des fois ça répond à la question.

Ici, pas forcement. Ce n'est pas parce que quelque chose
d'indéfini fonctionne sur une implémentation qu'il fonctionne
partout.

--
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
Pierre Maurette
Guest





PostPosted: Mon May 16, 2005 12:57 pm    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email], le 16/05/2005, a écrit :
Quote:
Pierre Maurette wrote:

[...]
Quote:
FILE *flux_orig;
FILE *flux_dest;

Comment les initialisez-vous ? Un fopen() pour le premier, le
même ou un malloc(sizeof(FILE)) pour le second ?

Ce n'est pas garantie que malloc(sizeof(FILE)) compile. Le type
FILE n'est pas forcement complet. (Je crois même qu'il peut être
void, mais je ne suis pas sûr.)
Je posais la question de l'initialisation, puisque le code était

furieusement incomplet.
Sinon, j'avais envisagé l'objet void, mais la possibilité d'un type
incomplet m'avait échappé.

Quote:
fseek(flux_orig, là_où_je_veux, SEEK_SET);
*flux_dest = *flux_orig;

ou
memcpy(flux_dest, flux_orig, sizeof(FILE));

Comme ci-dessus.

Le même vaut pour l'affectation, aussi.

Aussi, j'ai mes doutes quant à la légalité d'une expression du
genre *unFile. Là non plus, je ne suis pas 100% sûr, mais je
crois qu'une implémentation pourrait bien mettre des entiers
arbitraires dedans, et non de véritables pointeurs. C-à-d donc
que le code pourrait se compiler, mais provoquer un core lors de
l'exécution.
Je ne sais pas ce qu'en dit la norme, mais effectivement je ne serais

pas choqué si une implémentation de fopen() était un wrapper d'un FOPEN
de l'OS qui lui-même renverrait un handle. Ce handle serait simplement
mis en bijection avec le pointeur FILE* renvoyé. C'est ce que je
voulais dire par "la valeur du pointeur renvoyé joue un rôle de clé
d'identification".

[...]
Quote:
J'imagine que vous êtes étudiant et n'avez pas de machine à
disposition. Sinon, postez du code compilable, c'est mieux et
des fois ça répond à la question.

Ici, pas forcement. Ce n'est pas parce que quelque chose
d'indéfini fonctionne sur une implémentation qu'il fonctionne
partout.
Bien entendu. Néanmoins, les deux FILE* non initialisés, sans points de

suspensions, dans ce qui ressemble quand même à un listing, ça fait
désordre.
Et quand j'écris "des fois ça répond à la question", je veux dire que
souvent, en isolant le minimum de code contenant le problème, on résoud
le problème.
Et puis c'est plus sympa, non ? Pour ceux qui comme moi s'amusent avec
le code posté, ou d'autres qui le passent dans une quelconque
moulinette.

--
Pierre


Back to top
Harpo
Guest





PostPosted: Tue May 17, 2005 5:40 pm    Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

Miguel wrote:

Quote:
Bonjour,
Dans l'un de mes "programmes", j'écris dans un fichier toujours au
même endroit, toujours le même nombre de caractères (en utilisant
cstdio/stdio.h).
Pour ce faire, j'utilise fseek avant chaque nouvelle écriture.
J'aimerais savoir si il y a un moyen de contourner cet appel à fseek
(dans un souci de gain de temps)

Tu comptes gagner combien de millisecondes par an ?

Quote:
*flux_dest = *flux_orig;

Hummm ...

Si tu as un système à peu près posixly correct, essayes 'man mmap',
sinon il est toujours possible d'ouvrir un fichier en read/write, il
est possible qu'il y ait des solutions sans qu'il ne soit besoin
d'écrire un driver.

Back to top
Marc Espie
Guest





PostPosted: Fri May 20, 2005 10:27 am    Post subject: Re: Re: la valeur pointé par un FILE* est-elle intéressante? Reply with quote

Faut voir qu'en plus toutes les infos necessaires a la gestion du fichier
ne sont pas toujours juste derriere le FILE, il y a souvent un pimpl qui
traine...

c'est meme precisement le cas sur, au moins, tous les BSD, ou la bibliotheque
standard fait directement reference a la taille de la structure de base FILE
par ci, par la, et ou rajouter des infos derriere un pointeur auxiliaire
a permis d'eviter de changer d'ABI a chaque rajout...

Bref, copier des FILE, ou fabriquer les siens soi-meme, serait une
fort mauvaise idee.
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.