GNT sans publicité, site mobile, fonctionnalitées exclusives...

Fichier en C

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

//début du code

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

int main()
{
FILE *file = NULL;

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

if(file != 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é me retourné 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é se placer à la
fin du fichier, Non?
Alors voilà, pourquoi ?
Je tiens à préciser que le fichier pris en exemple n'est pas vide à
l'ouverture de celui ci.(logique, mais mieux vaut préciser :-)) ).

J'ai essayer d'ouvrir le fichier en binaire(ab, ab+), mais aucun
changement.
Si quelqu'un pourrait m'expliquer cela, se serait très sympa.
Merci d'avance !!!
Lire les 17 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
JKB
Le #22697031
Le Wed, 20 Oct 2010 06:04:59 -0700 (PDT),
loic001
Bonjour à tous,



Bonjour tout seul.

J'ai déjà poser cette question sur d'autre forums mais personne n'a su
me répondre donc voilà,
J'ai tester par hasard un bout de code en C tout simple utilisant les
fonctions de fichier en C.
Le voici :

//début du code

#include #include
int main()
{
FILE *file = NULL;

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

if(file != 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é me retourné 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é se placer à la
fin du fichier, Non?



Parce que ton implantation de ftell() est bugguée jusqu'à le moëlle.
Chez moi, ton code fonctionne parfaitement :

cauchy:[~] > /tmp/a.out
387cauchy:[~] >

Quel est le compilo, qu'on évite de l'utiliser ?

Essaye aussi de virer le C:\ du fopen(). Je ne connais pas Windows
(mon thérapeute me l'interdit), mais il y a peut-être quelque chose
par là.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
loic001
Le #22697021
"Quel est le compilo, qu'on évite de l'utiliser ?"

J'utilise MinGW, qui est basé sur GCC. Donc pour cela, pas de
problème.
Mais je pense que cela vient de Windows. Après, a vous de me prouvez
le contraire car aucune idées.

"Essaye aussi de virer le C:\ du fopen(). Je ne connais pas
Windows"
J'ai essayer de créer le fichier dans le dossier de l'exécutable( ên
faisant juste "text.txt") mais c'est le même scénario.

Merci d'avoir répondu.
Samuel DEVULDER
Le #22698061
Juste pour info, si tu veux connaitre la taille du fichier, il y les
fonctions stat() et ses cousines (fstat(), lstat()) qui sont simples.

#include #include #include
int stat(const char *file_name, struct stat *buf);

==> La taille du fichier se trouve dans buf.st_size (en octets)

sam.
FX
Le #22698501
loic001 a écrit :
J'utilise MinGW, qui est basé sur GCC. Donc pour cela, pas de
problème.
Mais je pense que cela vient de Windows. Après, a vous de me prouvez
le contraire car aucune idées.



Je confirme: ça vient bien de Windows. J'ai le même comportement que toi
sous Visual Studio.

Néanmoins en écrivant dans le fichier, les données sont bien ajoutées à
la fin. Et après cela, la fonction ftell fonctionne correctement.

L'explication est là:

http://msdn.microsoft.com/en-us/lib...80%29.aspx

"Note that when a file is opened for appending data, the current file
position is determined by the last I/O operation, not by where the next
write would occur. For example, if a file is opened for an append and
the last operation was a read, the file position is the point where the
next read operation would start, not where the next write would start.
(When a file is opened for appending, the file position is moved to end
of file before any write operation.) If no I/O operation has yet
occurred on a file opened for appending, the file position is the
beginning of the file."

Ce qui se passe est donc que tant que tu n'as pas fait d'écriture, ftell
te retourne la position en lecture qui est en début de fichier (même
avec l'option "a" qui ne permet pourtant pas d'écrire !)
Tonton Th
Le #22699321
On 10/20/2010 03:23 PM, JKB wrote:


Essaye aussi de virer le C:\ du fopen().



Ton thérapeute ne te soigne pas bien.

D'un autre coté ftell(), philosophiquement parlant, est censé te
dire à quel endroit va se faire l'opération suivante. Mais suivante
de quoi ? D'une opération précédente ? Mais il n'y a pas eu la
moindre opération. Juste un open() qui précise, certes, qu'on a
l'intention d'ajouter des trucs en fin de fichier. Est-ce suffisant
pour que la plomberie connaisse bien tes intenstions ? Je pense
que non. En plus, tu causes à un ordinateur. Ces trucs là sont
idiots.

Fseek(à_la_fin), Ftell(et_on_est_où,_la?)




--
Ma coiffeuse est formidable - http://sonia.buvette.org/
Publicité
Suivre les réponses
Poster une réponse
Anonyme