 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Miguel Guest
|
Posted: Sat May 14, 2005 9:01 am Post subject: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Sat May 14, 2005 9:44 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Sat May 14, 2005 10:34 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
| 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
|
Posted: Sat May 14, 2005 10:37 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
Désolé pour la grammaire
la valeur pointéE par un FILE* est-elle intéressante?
|
|
| Back to top |
|
 |
gregg Guest
|
Posted: Sat May 14, 2005 10:54 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Sat May 14, 2005 11:29 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Sat May 14, 2005 5:36 pm Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Mon May 16, 2005 8:55 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Mon May 16, 2005 11:38 am Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Mon May 16, 2005 12:57 pm Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
[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
|
Posted: Tue May 17, 2005 5:40 pm Post subject: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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
|
Posted: Fri May 20, 2005 10:27 am Post subject: Re: Re: la valeur pointé par un FILE* est-elle intéressante? |
|
|
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 |
|
 |
|
|
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
|
|