Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

10 réponses

1 2
Avatar
JKB
Le Wed, 20 Oct 2010 06:04:59 -0700 (PDT),
loic001 écrivait :
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 <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?



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
Avatar
loic001
"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.
Avatar
Samuel DEVULDER
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 <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

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

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

sam.
Avatar
FX
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/library/0ys3hc0b%28VS.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 !)
Avatar
Tonton Th
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/
Avatar
-ed-
On 20 oct, 15:04, loic001 wrote:
Bonjour à tous,
J'ai déjà poser cette question sur d'autre forums mais personne n'a s u
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 !!!



Normal. ftell() ne fonctionne quàprès une opération décriture, de
lecture ou de positionnement.

ceci est conforme (Windows) :

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

int main(void)
{
FILE *file = NULL;

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

if(file != NULL)
{
fprintf(file,"n");
printf("%ldn", ftell(file));
fclose(file);

system("type test.txt");
}

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

}

Sortie :

17
Hello world



Process returned 0 (0x0) execution time : 0.078 s
Press any key to continue.

Evidemment, ça ajoute un 'n' (windows : CRLF) à chaque appel. C'est
juste un test ... Pour déterminer la taille, utiliser fseef() à la fin
(SEEK_END).
Avatar
Antoine Leca
Samuel DEVULDER écrivit :
Juste pour info, si tu veux connaitre la taille du fichier, il y les
fonctions stat() et ses cousines (fstat(), lstat()) qui sont simples.



À condition que le fichier ait été fermé, ou à tout le moins que des
précautions aient été prises pour s'assurer que les informations de
taille et de dernière modification aient été mises à jour: ce que
garantit POSIX, mais pas forcément d'autres systèmes...


Antoine
Avatar
Antoine Leca
loic001 écrivit :
file = fopen("C:test.txt", "a"); //ou a+



Fichier texte, et OS avec une différence réelle à ce niveau.

printf("%ld", ftell(file));



??? Quel est l'objectif recherché ?


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.



Parce que tu n'as pas bougé le curseur...

Le mode d'ouverture a ou a+ est sensé se placer à la
fin du fichier, Non?



Non. Le mode "a" demande à ce que toutes les écritures aient lieu à la
fin du fichier, ce qui n'est pas la même chose.
En fait le mode "a" agit en écriture indépendamment du « curseur » ; un
peu comme s'il y avait deux curseurs, un pour lire (uniquement si "a+")
et un pour écrire (sur lequel tu n'as d'ailleurs aucun contrôle).

Après, la manière dont c'est réellement implémenté peut varier ; pour
parer à toute éventualité, la norme spécifie donc que l'on NE peut PAS
faire suivre une écriture par une lecture SANS faire soit une opération
de vidange (fflush), soit une opération de replacement (fseek ou rewind)
: cette restriction existe parce que certains systèmes ne sont pas
capables de gérer deux curseurs complètement séparés (y compris le cache
afférent).


Antoine
Avatar
Antoine Leca
loic001 écrivit :
"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.



Deux erreurs : d'abord, MingW est une implémentation, constituée
historiquement de GCC comme compilateur et de la bibliothèque
d'exécution Microsoft présente en standard sur la machine. Et devine
quoi : les fonctions fxxx appartiennent à la bibliothèque d'exécution,
pas au compilateur !
Deuxième erreur, le fait que ce soit du logiciel libre ne garantit pas
l'absence de problème.

Par ailleurs, JKB a oublié de mettre un souriard dans sa remarque...
il ne faut pas le prendre au pied de la lettre, c'était ironique.


Mais je pense que cela vient de Windows.



Mézigues pense que [ l'idée que tu cherches à mettre en œuvre ] vient
plutôt de Unix... et que ton souci est que cela n'atterrit pas bien chez
Windows !


Antoine
Avatar
loic001
Et bien, merci beaucoup à tous!!!
(vous êtes les premiers et plus particulièrement Antoine Leca et FX à
me répondre clairement à se sujet).
Je comprend maintenant mieux le comportement de ces fonctions.
Pour terminer, une dernière question :
Pourquoi l'usage de fseek() juste après l'ouverture en ce même mode (a
ou a+) ne fait-elle pas effet.
Ce que je veux dire par là c'est que le curseur ne veut pas bouger.
Est ce la même raison que ftell(), c'est à dire qu'il y a en quelque
sorte deux curseur comme Antoine Leca m'a dit ??? ou non :-))
Bref, une petite aide serait très apprécier.
Merci d'avance
1 2