Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
841 connectés 

  FORUM HardWare.fr
  Programmation
  C

  tester si un fichier est vide

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tester si un fichier est vide

n°1338548
sandra771
Posté le 04-04-2006 à 11:45:29  profilanswer
 

Bonjour,
Je voudrais tester si un fichier est vide (auquel cas je l'effacerai avec la fonction remove). Comment puis-je faire cela sans trop de lignes de code?
J'ai pensé à ouvrir le fichier (qui contient du code ASCII) et tester si la lecture de la première ligne est égale à " " mais je ne suis pas très sûre...
Merci d'avance!
Sandra

mood
Publicité
Posté le 04-04-2006 à 11:45:29  profilanswer
 

n°1338555
_darkalt3_
Proctopathe
Posté le 04-04-2006 à 11:52:16  profilanswer
 

ou en testant sa taille.
 
Cela dit l'ouvrir et en récuperer des caractères n'est pas une mauvaise idée.

n°1338614
doudoudeta​hiti
PowerDoudou
Posté le 04-04-2006 à 12:35:16  profilanswer
 

Ce que tu peus faire c'est utiliser la fonction fseek, qui permet d'ouvrir un fichier en positionnant ton curseur ou tu veus, si l'indice de début "SEEK_SET" est le même que l'indice de fin "SEEK_END", alors tu peus considérer  que le fichier est vide. Je pense que ça peut marcher comme ça.
 
je te conseil un man fseek pour plus de détail

Message cité 1 fois
Message édité par doudoudetahiti le 04-04-2006 à 12:36:22
n°1338615
doudoudeta​hiti
PowerDoudou
Posté le 04-04-2006 à 12:36:18  profilanswer
 

Ce que tu peus faire c'est utiliser la fonction fseek, qui permet d'ouvrir un fichier en positionnant ton curseur ou tu veus, si l'indice de début "SEEK_SET" est le même que l'indice de début "SEEK_END", alors tu peus considérer comme le fichier vide. Je pense que ça peut marcher comme ça.
 
je te conseil un man fseek pour plus de détail

n°1338628
Elmoricq
Modérateur
Posté le 04-04-2006 à 12:56:38  profilanswer
 

Pour le fun, tu peux aussi utiliser la fonction stat(), qui renseigne une structure "struct stat", structure qui contient entre autres choses le champ st_size (taille en bytes du fichier).
 
Je dis "pour le fun" parce que c'est une fonction POSIX, donc pas forcément disponible sur ton système d'exploitation (mais vu que c'est P90 il y a de grandes chances pour que tu l'aies... mais gaffe à la portabilité).

n°1338629
LePhasme
Les Belges domineront le monde
Posté le 04-04-2006 à 12:58:09  profilanswer
 

Tente de faire une lecture dedans, si tu es à eof c'est qu'il est vide.


Message édité par LePhasme le 04-04-2006 à 12:58:30
n°1338633
Trap D
Posté le 04-04-2006 à 13:06:26  profilanswer
 

fopen("toto","r" )
fseek(f, SEEK_END)
ftell(f)
fclose()
ftell renvoie la longueur du fichier.

Message cité 1 fois
Message édité par Trap D le 04-04-2006 à 13:06:52
n°1338637
Elmoricq
Modérateur
Posté le 04-04-2006 à 13:10:35  profilanswer
 

Trap D a écrit :

fopen("toto","r" )
fseek(f, SEEK_END)
ftell(f)
fclose()
ftell renvoie la longueur du fichier.


 
C'est effectivement la plus portable des solutions.
 
Pour utiliser stat() (j'insiste, c'est POSIX, donc "plus ou moins portable" => méfiance) :
 
struct stat machin;
stat("chemin/vers/mon/fichier", &machin);
/* => machin.st_size contient la taille du fichier */
 

n°1338641
sandra771
Posté le 04-04-2006 à 13:13:47  profilanswer
 

Merci beaucoup pour tous vos conseils!

n°1338776
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-04-2006 à 14:55:58  profilanswer
 

doudoudetahiti a écrit :

Ce que tu peus faire c'est utiliser la fonction fseek, qui permet d'ouvrir un fichier en positionnant ton curseur ou tu veus, si l'indice de début "SEEK_SET" est le même que l'indice de fin "SEEK_END", alors tu peus considérer  que le fichier est vide. Je pense que ça peut marcher comme ça.


et ftell()...
 
En mode texte uniquement. En mode binaire, le résultat est indéterminé.


Message édité par Emmanuel Delahaye le 04-04-2006 à 14:56:29

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 04-04-2006 à 14:55:58  profilanswer
 

n°2147478
belbah
Posté le 28-06-2012 à 16:23:38  profilanswer
 

voici la syntaxe:  
 
FILE * f=fopen(SANDER,"r" );
fseek(f,0,SEEK_END);  
long lfile=ftell(f);   //longueur du fichier  
if(lfile2==0) ...
fclose(f);

n°2147479
belbah
Posté le 28-06-2012 à 16:27:18  profilanswer
 

voici la syntaxe:
 
FILE * f=fopen(SANDER,"r" );
fseek(f,0,SEEK_END);  
long lfile=ftell(f);   //longueur du fichier  
if(lfile==0)...
fclose(f);


Message édité par belbah le 28-06-2012 à 16:27:51
n°2147480
theshockwa​ve
I work at a firm named Koslow
Posté le 28-06-2012 à 16:28:51  profilanswer
 

merci de répondre à ce topic vieux de 6 ans. Qui plus est, cette technique pose problème avec des fichiers de plus de 4Go ...
La meilleure façon reste encore de faire avec ce que l'OS propose.


---------------
last.fm
n°2150803
edwoud
⭐ shériff de l'espace
Posté le 25-07-2012 à 09:47:41  profilanswer
 

theshockwave a écrit :

merci de répondre à ce topic vieux de 6 ans. Qui plus est, cette technique pose problème avec des fichiers de plus de 4Go ...
La meilleure façon reste encore de faire avec ce que l'OS propose.


 
Non, pas si tu utilises size_t au lieu de long comme variable résultat du ftell  :jap:  
 
Et un compilateur qui date pas de la dernière guerre...

Message cité 1 fois
Message édité par edwoud le 25-07-2012 à 09:47:59
n°2150846
theshockwa​ve
I work at a firm named Koslow
Posté le 25-07-2012 à 11:05:14  profilanswer
 

edwoud a écrit :


 
Non, pas si tu utilises size_t au lieu de long comme variable résultat du ftell  :jap:  
 
Et un compilateur qui date pas de la dernière guerre...


 
You, sir, missed the point : sur une plateforme 32 bits, ton size_t (comme un long int) fait 32 bits, donc ton fichier de 4Go te pose toujours un souci ... Après, l'API définit que ftell retourne un long int, sous windows en x64, un long int fait toujours 32 bits. Même si tu stockes le résultat dans un size_t (qui cette fois-ci, est bien 64 bits), tu auras une valeur tronquée, donc tu l'auras dans l'os.


---------------
last.fm
n°2150848
Terminapor
I'll see you rise.
Posté le 25-07-2012 à 11:06:59  profilanswer
 

Mais c'est pas techniquement possible de lire un fichier de plus de 4go sur un 32bits ? Sans découpage :D


---------------
Perhaps you don't deserve to breathe
n°2150870
theshockwa​ve
I work at a firm named Koslow
Posté le 25-07-2012 à 11:24:35  profilanswer
 

Terminapor a écrit :

Mais c'est pas techniquement possible de lire un fichier de plus de 4go sur un 32bits ? Sans découpage :D


 
bah, tu peux pas le stocker entièrement en mémoire, non, t'as pas un espace d'adressage suffisant. Cela dit, rien ne t'empêche de le processer à la volée. C'est rarement une bonne chose que de se balader dans le fichier à coups de ftell et fseek "absolus".


---------------
last.fm
n°2150875
Un Program​meur
Posté le 25-07-2012 à 11:29:58  profilanswer
 

http://www.unix.org/version2/whatsnew/lfs.html
 
(Pour le probleme initial, je tenterais simplement de lire un byte et je ne m'amuserais pas avec fseek, ftell etc).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2150947
edwoud
⭐ shériff de l'espace
Posté le 25-07-2012 à 14:44:33  profilanswer
 

theshockwave a écrit :


 
You, sir, missed the point : sur une plateforme 32 bits, ton size_t (comme un long int) fait 32 bits, donc ton fichier de 4Go te pose toujours un souci ... Après, l'API définit que ftell retourne un long int, sous windows en x64, un long int fait toujours 32 bits. Même si tu stockes le résultat dans un size_t (qui cette fois-ci, est bien 64 bits), tu auras une valeur tronquée, donc tu l'auras dans l'os.


 
Effectivement, je me suis laissé abuser. On peut les lire mais avoir leur taille, c'est plus casse-couille...
 
Si je regarde (sous windows) les .h, la position dans le fichier est bien un 64bits (fpos_t) -> __int64
 
il faudrait utiliser fgetpos pour avoir la bonne valeur mais c'est sûrement pas portable
 
si je regarde sous un linux 32 bits, ça m'a l'air transparent via un jeu de #define -> __USE_LARGEFILE64
 
Mais si je teste sous linux32, j'ai un segfault lors du ftell  :D  (bordel!)
 
Faudrait passer par ftello64 sur linux (en 32 bits)
 
rien de portable en somme...

Message cité 2 fois
Message édité par edwoud le 25-07-2012 à 14:53:57
n°2150989
theshockwa​ve
I work at a firm named Koslow
Posté le 25-07-2012 à 16:13:49  profilanswer
 

edwoud a écrit :


 
Effectivement, je me suis laissé abuser. On peut les lire mais avoir leur taille, c'est plus casse-couille...
 
Si je regarde (sous windows) les .h, la position dans le fichier est bien un 64bits (fpos_t) -> __int64
 
il faudrait utiliser fgetpos pour avoir la bonne valeur mais c'est sûrement pas portable
 
si je regarde sous un linux 32 bits, ça m'a l'air transparent via un jeu de #define -> __USE_LARGEFILE64
 
Mais si je teste sous linux32, j'ai un segfault lors du ftell  :D  (bordel!)
 
Faudrait passer par ftello64 sur linux (en 32 bits)
 
rien de portable en somme...


 
 :jap: exact. D'où ma recommandation d'aller voir ce que propose l'OS pour ce genre de choses :)


---------------
last.fm
n°2151090
xilebo
noone
Posté le 26-07-2012 à 09:20:13  profilanswer
 

edwoud a écrit :


 
Effectivement, je me suis laissé abuser. On peut les lire mais avoir leur taille, c'est plus casse-couille...
 
Si je regarde (sous windows) les .h, la position dans le fichier est bien un 64bits (fpos_t) -> __int64
 
il faudrait utiliser fgetpos pour avoir la bonne valeur mais c'est sûrement pas portable
 
si je regarde sous un linux 32 bits, ça m'a l'air transparent via un jeu de #define -> __USE_LARGEFILE64
 
Mais si je teste sous linux32, j'ai un segfault lors du ftell  :D  (bordel!)
 
Faudrait passer par ftello64 sur linux (en 32 bits)
 
rien de portable en somme...


 
C'est plutôt ça qu'il faut mettre  : -D_FILE_OFFSET_BITS=64

n°2151092
edwoud
⭐ shériff de l'espace
Posté le 26-07-2012 à 09:23:03  profilanswer
 

xilebo a écrit :


 
C'est plutôt ça qu'il faut mettre  : -D_FILE_OFFSET_BITS=64


 
 :jap:  

n°2151118
gilou
Modérateur
Modzilla
Posté le 26-07-2012 à 11:53:19  profilanswer
 

Sous Windows, il faut utiliser la structure __stat64 et les fonctions associées (_fstat64), pour les fs admettant des fichiers de taille supérieure à  2Go.
C'est pas nouveau, vu que ça date de Win98.
L'équivalent unix (stat64 et fstat64 est par contre maintenant "deprecated" )
A+,


Message édité par gilou le 26-07-2012 à 11:56:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  tester si un fichier est vide

 

Sujets relatifs
Vider la corbeille avec un fichier *.vbsFichier effacer contenu vb.net
Afficher le contenu d'un fichierrechercher dans un fichier texte
wikirenderer et fichier texte...Faire un appel à des variables contenu dans un fichier
Découper un fichier audiocomment je peux créé un fichier éxécutable svp
copier le résultat d'une commande dans un fichiertester un ligne vide dans un fichier
Plus de sujets relatifs à : tester si un fichier est vide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR