OVH Cloud OVH Cloud

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

23 réponses
Avatar
Miguel
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

10 réponses

1 2 3
Avatar
Emmanuel Delahaye
Miguel wrote on 14/05/05 :
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".

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
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

Avatar
Miguel
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.

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... :'(


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*...


Avatar
Miguel
Désolé pour la grammaire
la valeur pointéE par un FILE* est-elle intéressante?
Avatar
gregg
Miguel wrote:

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" ???

++

Avatar
gregg
Miguel wrote:

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" ???

++

Avatar
Pierre Maurette
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 ?


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

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


(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.

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

Avatar
Miguel
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" ???
ouais, comme "r+" pour modification et "t" pour text ;-)



++



Avatar
Emmanuel Delahaye
Miguel wrote on 14/05/05 :
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" ???
ouais, comme "r+" pour modification et "t" pour text ;-)


++



Le 't' n'est pas défin par la norme. Il ne sert à rien. Tu peux faire
"r+".

Par contre, j'ai des doutes sur le '+'. Tu veux lire et écrire dans le
même fichier en même temps ? Ca se traduit généralement par une
destruction du fichier. Il est plus simple et plus sur d'utilise 2
fichier source (un "r", un "w"), et de faire une une copie selective...

--
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



Avatar
Hamiral
Emmanuel Delahaye wrote:
Par contre, j'ai des doutes sur le '+'. Tu veux lire et écrire dans le
même fichier en même temps ? Ca se traduit généralement par une
destruction du fichier. Il est plus simple et plus sur d'utilise 2
fichier source (un "r", un "w"), et de faire une une copie selective...


Si le fichier n'est pas trop gros, autant tout charger en mémoire, faire les
traitements dessus puis écraser le fichier ensuite. En plus, le souci
principal de l'OP étant la performance, c'est probablement une meilleure
solution. Non ?

Bon, évidemment, suivant les systèmes, la taille du fichier, toussa ... Ça
peut être possible ou pas ...

--
Hamiral

Avatar
Miguel
Par contre, j'ai des doutes sur le '+'. Tu veux lire et écrire dans le
même fichier en même temps ? Ca se traduit généralement par une
destruction du fichier. Il est plus simple et plus sur d'utilise 2
fichier source (un "r", un "w"), et de faire une une copie selective...


Si le fichier n'est pas trop gros, autant tout charger en mémoire, faire
les
traitements dessus puis écraser le fichier ensuite. En plus, le souci
principal de l'OP étant la performance, c'est probablement une meilleure
solution. Non ?

Bon, évidemment, suivant les systèmes, la taille du fichier, toussa ... Ça
peut être possible ou pas ...


Mon "r+t" marche à merveille comme je veux(au passage, c'est un type
d'ouverture donné pour exemple de la fonction fopen sur le site
www.cplusplus.com ), mon fichier fait 83 caractères.
Est-ce que l'écrasement du fichier est un réel gain de temps par rapport au
repositionnement du flux?


1 2 3