OVH Cloud OVH Cloud

Fichier en C

17 réponses
Avatar
loic001
Bonjour =E0 tous,
J'ai d=E9j=E0 poser cette question sur d'autre forums mais personne n'a su
me r=E9pondre donc voil=E0,
J'ai tester par hasard un bout de code en C tout simple utilisant les
fonctions de fichier en C.
Le voici :

//d=E9but du code

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *file =3D NULL;

file =3D fopen("C:\\test.txt", "a"); //ou a+

if(file !=3D NULL)
{
printf("%ld", ftell(file));
fclose(file);
}


else
{
printf("Error opening file !");
}
return 0;

} //fin du code

Ma question :
pourquoi la fonction ftell qui est sens=E9 me retourn=E9 la valeur
courante de l'indicateur de position (ou le dit curseur "virtuel") me
renvoi t-elle 0. Le mode d'ouverture a ou a+ est sens=E9 se placer =E0 la
fin du fichier, Non?
Alors voil=E0, pourquoi ?
Je tiens =E0 pr=E9ciser que le fichier pris en exemple n'est pas vide =E0
l'ouverture de celui ci.(logique, mais mieux vaut pr=E9ciser :-)) ).

J'ai essayer d'ouvrir le fichier en binaire(ab, ab+), mais aucun
changement.
Si quelqu'un pourrait m'expliquer cela, se serait tr=E8s sympa.
Merci d'avance !!!

7 réponses

1 2
Avatar
Antoine Leca
loic001 écrivit :
Pourquoi l'usage de fseek() juste après l'ouverture en ce même mode (a
ou a+) ne fait-elle pas effet.



fseek() avec "a" n'a aucun effet réel, puisque tu ne peux jamais
contrôler la position d'écriture.
Le seul objet pourrait être en mode "ab" et précédant un appel à
ftell(), mais là on rentre dans les détails scabreux et il est possible
que tu sois tombé sur un bogue d'implémentation, même si je doute.

fseek() avec "a+" devrait avoir un effet sur les lectures suivantes.
Et fonctionne d'ailleurs très bien dans mes tests (WinNT4-5-6).


Antoine
Avatar
Samuel DEVULDER
Le 22/10/2010 09:41, Antoine Leca a écrit :
loic001 écrivit :
Pourquoi l'usage de fseek() juste après l'ouverture en ce même mode (a
ou a+) ne fait-elle pas effet.



fseek() avec "a" n'a aucun effet réel, puisque tu ne peux jamais
contrôler la position d'écriture.



Heu, même avec un fseek() relatif (SEEK_END, SEEK_CUR) ? D'ailleurs je
me demande ce que donne le ftell() après un fseek(file, 0, SEEK_CUR) sur
un fichier ouvert en "a".

sam.
Avatar
Antoine Leca
Samuel DEVULDER écrivit :
Le 22/10/2010 09:41, Antoine Leca a écrit :
fseek() avec "a" n'a aucun effet réel, puisque tu ne peux jamais
contrôler la position d'écriture.



Heu, même avec un fseek() relatif (SEEK_END, SEEK_CUR) ?



Bin non, je ne vois pas comment éviter que les écritures se fassent
séquentiellement les unes après les autres, sans trous, ajoutées après
le contenu original du fichier.

Sauf si des threads ou des processus parallèles viennent mettre de
l'ambiance, mais bon, là on s'éloigne...


D'ailleurs je me demande ce que donne le ftell() après un
fseek(file, 0, SEEK_CUR) sur un fichier ouvert en "a".



La même chose que sans le fseek :^) autrement dit la « position actuelle
» de l'inutile « curseur ».


Antoine
Avatar
loic001
Donc avec ce que vous me dite la, on ne peut pas déplacer le curseur
d'ecriture avec fseek. Ok, et peut-on faire autrement car pas bien
pratique, même si comme son nom l'indique il fait des mise à jour. On
peut donc comprendre qu'il écrive à la fin.
Mais alors quelle mode utiliser pour pouvoir faire de l'écriture seule
sans effacer le contenu du fichier à son ouverture ? Car w ou w+
supprime le contenu!!! Il n'y à donc pas d'autre fonction en écriture
seule pouvant faire ce que j'ai demander ?

(w, w+ permet de se déplacer mais supprime le contenu, et a l'ouvre en
écriture sans vider son contenu mais on ne peut pas se déplacer) Que
faire ? Je tient à précisez que je veux ouvrir le fichier uniquement
en écriture. Car a+ aurait pu faire l'affaire, et encore, :-))

Merci à tous.
Avatar
Samuel DEVULDER
Le 22/10/2010 16:28, loic001 a écrit :
Donc avec ce que vous me dite la, on ne peut pas déplacer le curseur
d'ecriture avec fseek.



Moi je ne suis pas convaincu (il faudra que j'experimente). En tout cas
à la lecture fseek marche bien sur les fichiers disks.

Seul bémol: il semble d'après mon "man fseek" que sur les fichiers
ouverts en 'a' il soit *volontairement* inopérant car le mode a signifie
qu'on veut *exclusivement* faire de l'append, cad de l'ajout à la fin.
La solution est probablement dans le mode lecture + ecriture: r+

Mais alors quelle mode utiliser pour pouvoir faire de l'écriture seule
sans effacer le contenu du fichier à son ouverture ? Car w ou w+
supprime le contenu!!! Il n'y à donc pas d'autre fonction en écriture
seule pouvant faire ce que j'ai demander ?



fopen en "r+" devrait de permettre décrire au début sans remettre à zero
la taille du fichier. Si ensuite tu fais fseek(fichier, 0, SEEK_END) tu
de places en fin de fichier et c'est comme si tu l'avais ouvert en mode
'a' mais avec un flux permettant l'usage de fseek.

sam.
Avatar
Antoine Leca
loic001 écrivit :
peut-on faire autrement car pas bien pratique,



Stop. Arrêtez de cherchez à voir « comment faire autrement », et
définissez votre problème.

Si votre problème c'est d'envoyer des informations genre journalisation
dans un fichier, le mode "a" est effectivement adapté. Si c'est pour
jouer avec des fichiers, les probabilités sont nettement moins bonnes...


Mais alors quelle mode utiliser pour pouvoir faire de l'écriture seule
sans effacer le contenu du fichier à son ouverture ?



"r+" ou "r+b". Je sais, ce n'est pas évident.
Si le fichier peut ne pas exister, c'est "r+", si NULL alors "w".

Il faut voir que "w", cela correspond en fait au cas d'une bande ou plus
généralement d'un fichier de sortie, donc toujours créé dans le
programme (tout ceci a des réminiscences du traitement par lots...)

Ne pas oublier de faire un fseek si en plus on veut commencer à écrire
ailleurs qu'au début.


Antoine
Avatar
loic001
Ok, est bien je vais pouvoir arrêter de vous embêter, merci à vous
tous pour votre aide et pourquoi pas à bientôt sur le forum !!!

loic001
1 2