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

  FORUM HardWare.fr
  Programmation
  C

  Comment recupérer de l'espace disque en C?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment recupérer de l'espace disque en C?

n°532768
peak
Posté le 06-10-2003 à 20:06:57  profilanswer
 

Bonjour,
j'ai une question qui pour beaucoup semblera sans doute stupide  :sweat: .
 
Imaginons que j'ai un fichier "file.txt" contenant ce string "aaaaaa" et donc de 6bytes, mais que pour une raison quelconque les 2derniers 'a' ne m'intéresse plus. Comment récupérer l'espace disque et me retrouver avec un file.txt contenant "aaaa" et faisant 4bytes?

mood
Publicité
Posté le 06-10-2003 à 20:06:57  profilanswer
 

n°532769
skeye
Posté le 06-10-2003 à 20:07:42  profilanswer
 

:heink:
Tu effaces "aa" du fichier...[:skeye]


---------------
Can't buy what I want because it's free -
n°532771
chrisbk
-
Posté le 06-10-2003 à 20:08:12  profilanswer
 

skeye a écrit :

:heink:
Tu effaces "aa" du fichier...[:skeye]


 
Ben post nous ton code, pour voir :D

n°532772
skeye
Posté le 06-10-2003 à 20:09:00  profilanswer
 

chrisbk a écrit :


 
Ben post nous ton code, pour voir :D


tsssss


---------------
Can't buy what I want because it's free -
n°532773
chrisbk
-
Posté le 06-10-2003 à 20:09:56  profilanswer
 


 
he ben ? il arrive oui ? :O

n°532779
peak
Posté le 06-10-2003 à 20:22:09  profilanswer
 

J'ai donné un exemple bidon justement pour pas vous faire chier avec du code....mais si vous voulez voici le bout de code concerné :

Code :
  1. if (stat ("./conf/ListeServeurs.conf", &info_file) == -1)
  2. erreur("stat (./conf/ListeServeurs.conf, &info_file) == -1" );
  3. float sizefile = (float) info_file.st_size;
  4. unsigned Num_ordre_max= (sizefile / sizeof(struct info_serveur_rec));
  5. do{
  6. printf("\t\tServeur à effacer (-1 pour annuler) : " );
  7. scanf("%d", &x);
  8. }
  9. while(x!=-1 && (x >= Num_ordre_max || x<0));
  10. if(x!=-1){
  11. file=fopen("./conf/ListeServeurs.conf", "r+" );
  12. if(fseek(file,((x+1)*sizeof(struct info_serveur_rec)), SEEK_SET)==-1)
  13.  erreur("fseek(file,((x+1)*sizeof(struct info_serveur_rec)), SEEK_SET)==-1" );
  14. unsigned i= x;
  15. for(; i<Num_ordre_max-1; i++){
  16.  memset( &info_srv, 0, sizeof(struct info_serveur_rec));
  17.  if(fread(&info_srv, sizeof(struct info_serveur_rec) , 1, file) < 1)
  18.   erreur("fread(&rec1, sizeof(struct info_serveur_rec) , 1, file)<1" );
  19.  if(fseek(file, (-2*sizeof(struct info_serveur_rec)), SEEK_CUR)==-1)
  20.   erreur("fseek(file, -2*sizeof(struct info_serveur_rec), SEEK_CUR)==-1" );
  21.  --info_srv.Num_ordre;
  22.  if(fwrite( &info_srv, sizeof(struct info_serveur_rec), 1, file) < 1)
  23.   erreur("fwrite( &rec1, sizeof(struct info_serveur_rec), 1, file)==-1" );
  24.  if(fseek(file, sizeof(struct info_serveur_rec), SEEK_CUR)==-1)
  25.   erreur("fseek(file, sizeof(struct info_serveur_rec), SEEK_CUR)==-1" );
  26. }
  27. if(fseek(file, -sizeof(struct info_serveur_rec), SEEK_CUR)==-1)
  28.  erreur("fseek(file, -sizeof(struct info_serveur_rec), SEEK_CUR)==-1" );
  29. memset( &info_srv, 0, sizeof(struct info_serveur_rec));
  30. if(fwrite( &info_srv, sizeof(struct info_serveur_rec), 1, file) <1 )
  31.  erreur("fwrite( &rec1, sizeof(struct info_serveur_rec), 1, file) <1" );
  32. //j'aimerai recupérer l'espace de pseek à eof
  33. fclose(file);
  34. }

n°532780
chrisbk
-
Posté le 06-10-2003 à 20:25:27  profilanswer
 

superbe exemple de clareté, lisibilité et concision [:aloy]
 
(en tout cas tu viens de demontré l'interet des exceptions, dommage que tu sois en C :D)

n°532783
peak
Posté le 06-10-2003 à 20:30:47  profilanswer
 

chrisbk a écrit :

superbe exemple de clareté, lisibilité et concision [:aloy]
 
(en tout cas tu viens de demontré l'interet des exceptions, dommage que tu sois en C :D)
 


Ceci me semblai pourtant claire :
Imaginons que j'ai un fichier "file.txt" contenant ce string "aaaaaa" et donc de 6bytes, mais que pour une raison quelconque les 2derniers 'a' ne m'intéresse plus. Comment récupérer l'espace disque et me retrouver avec un file.txt contenant "aaaa" et faisant 4bytes?

n°532786
peak
Posté le 06-10-2003 à 20:41:02  profilanswer
 

skeye a écrit :

:heink:
Tu effaces "aa" du fichier...[:skeye]


Tout le problème est là  :ange: .
Jusque ici j'ai jamais eu besoin de récupérer l'espace disque et j'écrasait simplement les enregistrement dont j'avais plus besoin par une sentinelle mais dans ce cas si j'utilise stat pour connaître le nombre d'enregistrement que contient le fichier (taille_fichier/taille_enregistrement) donc j'ai vraiment besoin changer les attributs du fichier.

n°532789
Vinx
Posté le 06-10-2003 à 20:53:13  profilanswer
 

Je ne connais pas de méthode qui permette de supprimer des octects au beau milieu d'un fichier...
En principe je réécris le fichier. Tu le charges en mémoire et tu le ré-écris en virant ce que tu ne veux pas garder.
Tu passes par un fichier temporaire que tu renommes par la suite pour écraser le fichier d'origine.
 
Si quelqu'un a mieux comme solution :??:  
 
PS: quand je dis tu reécris, tu peux le faire à partir des octets à dégager en lisant plus loin dans le fichier et en écrivant à l'endroit où il faut supprimer des octets

mood
Publicité
Posté le 06-10-2003 à 20:53:13  profilanswer
 

n°532800
Moktar1er
No one replies...
Posté le 06-10-2003 à 21:10:56  profilanswer
 

pas mieux
copie du fichier dans un buffer
on parcourt le buffer octet par octet
on saute les octets indésirables
et on écrit dans le fichier

n°532817
peak
Posté le 06-10-2003 à 21:29:14  profilanswer
 

J'avais pensé à une technique du style :
 
Renomage
Création d'un fichier ayant le nom de base  
Recopiage de ce qu'il fallait garder du fichier renommé vers le nouveau
Effacement du fichier renommé
 
Mais les bytes à libérer sont toujours a la fin du fichier dans mon cas,  j'était persuadé qu'il existait une technique pour replacer EOF (je tassait la liste justement pour me retrouver avec la partie à effacer toujours à  la fin du fichier).
 
J?aurai encore pu chercher longtemps?..
Merci bien à tous !

n°532993
matafan
Posté le 07-10-2003 à 06:16:53  profilanswer
 

man truncate

n°533013
gilou
Modérateur
Modzilla
Posté le 07-10-2003 à 08:44:57  profilanswer
 

Je dirais meme plus:

#include <unistd.h>
 
       int truncate(const char *path, off_t length);
       int ftruncate(int fd, off_t length);
 
DESCRIPTION
       Truncate causes the file named by path or referenced by fd to  be  truncated to at most length bytes in size.  If the file previously was larger than this size, the extra  data is  lost.  With ftruncate, the file must be open for writing.


A+,


Message édité par gilou le 07-10-2003 à 08:45:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°533019
El_gringo
Posté le 07-10-2003 à 08:58:31  profilanswer
 

gilou a écrit :

Je dirais meme plus:

#include <unistd.h>
 
       int truncate(const char *path, off_t length);
       int ftruncate(int fd, off_t length);
 
DESCRIPTION
       Truncate causes the file named by path or referenced by fd to  be  truncated to at most length bytes in size.  If the file previously was larger than this size, the extra  data is  lost.  With ftruncate, the file must be open for writing.


A+,


 
Ouais, enfin, ça ça vaut ss unix. Sous windows, je crois qu'avec les MFC on peut faire un petit SetLength dans la classe CFile. Sinon, en C, on doit pouvoir se démerder avec SetFilePointer et SetEndOfFile
 
EDIT : mais j'vois pas le rapport avec "récupérer l'espace disque"


Message édité par El_gringo le 07-10-2003 à 09:05:48
n°533038
fodger
ARRRACHHEE TTAAA FFFOUUFFOUNE!
Posté le 07-10-2003 à 09:28:37  profilanswer
 

chrisbk a écrit :

superbe exemple de clareté, lisibilité et concision [:aloy]
 
(en tout cas tu viens de demontré l'interet des exceptions, dommage que tu sois en C :D)
 


 
mdr:lol:

n°533059
gilou
Modérateur
Modzilla
Posté le 07-10-2003 à 10:26:24  profilanswer
 

El_gringo a écrit :


 
Ouais, enfin, ça ça vaut ss unix. Sous windows, je crois qu'avec les MFC on peut faire un petit SetLength dans la classe CFile. Sinon, en C, on doit pouvoir se démerder avec SetFilePointer et SetEndOfFile
 
EDIT : mais j'vois pas le rapport avec "récupérer l'espace disque"


Tu veux donc plutot dire: Ouais, enfin, ça ça vaut presque partout, sauf sous windows...  
Parce que ftruncate, c'est dans POSIX.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°533146
ToxicAveng​er
Posté le 07-10-2003 à 12:16:13  profilanswer
 

gilou a écrit :


Tu veux donc plutot dire: Ouais, enfin, ça ça vaut presque partout, sauf sous windows...  
Parce que ftruncate, c'est dans POSIX.
A+,


 
oui mais posix, c'est pas iso non plus :o
 
Edit : me suis mal exprimé, "posix ca ne vaut pas l'iso" vala  :o


Message édité par ToxicAvenger le 07-10-2003 à 12:17:03
n°533155
dew
Posté le 07-10-2003 à 12:46:31  profilanswer
 

ça ne sert strictement à rien de faire ça pour un petit fichier
 
celui-ci est alloué dans des clusters qui font selon ton filesystem de 4 Ko à 32 Ko (en gros évidemment, il y a toujours des FS particuliers notamment sous linux)
 
donc un fichier contenant même un seul caractère occupera toujours 4 Ko minimum
 
par contre si l'opération est effectuée sur des gros fichiers ça peut marcher  :)


Message édité par dew le 07-10-2003 à 12:48:01
n°533158
chrisbk
-
Posté le 07-10-2003 à 12:49:10  profilanswer
 

dew a écrit :

ça ne sert strictement à rien de faire ça
le fichier est alloué dans des clusters qui font selon ton filesystem de 4 Ko à +
donc un fichier contenant même un seul caractère occupera toujours 4 Ko minimum.


 
Remarque ridicule
Il veut virer des donnees de son fichier, pas pour economiser de l'espace disque, mais parce qu'il en veut pu.  et ca se trouve il va virer deux octets faisant que son fichier tiendra sur un seul cluster au lieu de deux d'ou un gain de place [:dawa]
 

n°533188
LetoII
Le dormeur doit se réveiller
Posté le 07-10-2003 à 13:06:06  profilanswer
 

chrisbk a écrit :


 
Remarque ridicule
Il veut virer des donnees de son fichier, pas pour economiser de l'espace disque, mais parce qu'il en veut pu.  et ca se trouve il va virer deux octets faisant que son fichier tiendra sur un seul cluster au lieu de deux d'ou un gain de place [:dawa]
 
 


 
Il peut aussi augmenter la taille de son fichier afin d'utiliser l'espace allouer de façon plus optimale
 
[:dehors2]


---------------
Le Tyran
n°533471
peak
Posté le 07-10-2003 à 18:29:32  profilanswer
 

Matafan a écrit :

man truncate




 
 :jap: C'est exactement ce que je cherchais  :jap:  
Merci beaucoup.
 
La raison pour laquelle je voulai changer la taille c'est juste par ce que j'utilise  

Code :
  1. ]if (stat ("./conf/ListeServeurs.conf", &info_file) == -1)
  2. erreur("stat (./conf/ListeServeurs.conf, &info_file) == -1" );
  3. float sizefile = (float) info_file.st_size;
  4. unsigned Num_ordre_max= (sizefile / sizeof(struct info_serveur_rec));


pour calculer le nombre d'enregistrement se trouvant dans le fichier.
Si la taille n'est pas modifié cette technique n'avai plus de sens. :)  
 

n°533524
chrisbk
-
Posté le 07-10-2003 à 19:45:29  profilanswer
 

je suis pas sur que ca soit une bonne méthode

n°533525
MagicBuzz
Posté le 07-10-2003 à 19:48:00  profilanswer
 

chrisbk a écrit :

superbe exemple de clareté, lisibilité et concision [:aloy]
 
(en tout cas tu viens de demontré l'interet des exceptions, dommage que tu sois en C :D)


j'aime définitivement pas le C (ni le C++ par la même occasion). C'est impensable qu'un langage permette de coder d'une façon qui ferait vomir un goret [:spamafote]

n°533526
_maximus_
Goret ptit con ^_^
Posté le 07-10-2003 à 19:50:22  profilanswer
 

Si t'as pas envie de chaque fois reecrire ton fichier tu peux par exemple remplacer "aa" par des blanc...  
 
et quelque part d'autre dans le programme tu cree une fonction qui servira a optimiser ton fichier ( tout les mois par exemple ) qui elle reecrira le fichier sans les blanc.
 
C'est le principe des fichier de base de donnees il me semble...  
 
pour prendre un bete exemple sous access, tu peux la compacter, idem pour tes email sous outlook, l'idee est la.
 
l'interet? ne pas perdre un temps fou a chaque fois que tu modif un truc dans le fichier. Evidement si ton fichier fait 2ko ca n'a aucun interet, mais si il fait 500Mo ca commence a le devenir ;)
a+
 


---------------
Ptit con de goret je t'emmerde ^_^
n°533530
chrisbk
-
Posté le 07-10-2003 à 19:58:23  profilanswer
 

MagicBuzz a écrit :


j'aime définitivement pas le C (ni le C++ par la même occasion). C'est impensable qu'un langage permette de coder d'une façon qui ferait vomir un goret [:spamafote]  


 
Vu que n'importe quel langage te permet de faire des atrocités, tu programme en quoi ?

n°533540
MagicBuzz
Posté le 07-10-2003 à 20:11:48  profilanswer
 

chrisbk a écrit :


Vu que n'importe quel langage te permet de faire des atrocités, tu programme en quoi ?


je fais du VB :D (mine de rien, même un programme porc en VB reste bien plus lisible qu'un programme porc en C :D)
 
nan, sinon moi je veux faire de l'ADA :sweat:
 
lui au moins, t'as pas le droit à un pet de travers...

n°534968
gilou
Modérateur
Modzilla
Posté le 09-10-2003 à 01:00:53  profilanswer
 

MagicBuzz a écrit :


j'aime définitivement pas le C (ni le C++ par la même occasion). C'est impensable qu'un langage permette de coder d'une façon qui ferait vomir un goret [:spamafote]  


MB, la prochaine fois que je te prends a troller comme un porc, ca va etre un TT de une semaine.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°534969
ToxicAveng​er
Posté le 09-10-2003 à 01:20:57  profilanswer
 

gilou a écrit :


MB, la prochaine fois que je te prends a troller comme un porc, ca va etre un TT de une semaine.
A+,


 
euh, sans vouloir médire, je vois pas où c'est un troll ? (je précise que le C est mon langage préféré :o ).
 
La philosophie du C c'est : il est interdit d'interdire
C'est un langage ultra-permissif. On peut donc tres facilement tomber dans le code "goret"... Y'a meme des concours d'organisé pour ca (google : le plus petit othello en C (en taille de code source)).
 
Donc, je vois pas trop le troll la dedans...  :??:


Message édité par ToxicAvenger le 09-10-2003 à 01:21:29
n°535003
gilou
Modérateur
Modzilla
Posté le 09-10-2003 à 09:21:29  profilanswer
 

ToxicAvenger a écrit :


 
euh, sans vouloir médire, je vois pas où c'est un troll ? (je précise que le C est mon langage préféré :o ).
 
La philosophie du C c'est : il est interdit d'interdire
C'est un langage ultra-permissif. On peut donc tres facilement tomber dans le code "goret"... Y'a meme des concours d'organisé pour ca (google : le plus petit othello en C (en taille de code source)).
 
Donc, je vois pas trop le troll la dedans...  :??:


Une contribution reduite a
>j'aime définitivement pas le C (ni le C++ par la même occasion). C'est impensable qu'un langage permette de coder d'une façon qui ferait vomir un goret  
 
Chez moi ca s'appelle troller pour relancer le debat sur les langages meilleurs les uns que les autres, dans un topic dont c'est pas le sujet (il y a d'ailleurs un topic dedie a ce debat ailleurs il me semble: http://forum.hardware.fr/forum2.ph [...] post=31321 ).
 
A+,


Message édité par gilou le 09-10-2003 à 09:23:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°535074
ToxicAveng​er
Posté le 09-10-2003 à 11:11:49  profilanswer
 

ah ok, c'est le fait qu'il argumente pas qui t'a géné... :jap:

mood
Publicité
Posté le   profilanswer
 


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

  Comment recupérer de l'espace disque en C?

 

Sujets relatifs
[MySQL] récupérer le premier élément d'une structure hiérarchique...Comment recuperer une notification d'insertion CD en java?
[MySQL + PHP] Récupérer ne nb d'elements effacés par DELETERécupérer les infos ou sauvegarder une main frame
Récupérer le FSB et/ou le coef mult. d'un CPU ...[shell] comment récupérer 2 lignes
récupérer le 'www' d'un nom de domaine [ - Job's Done - ]comment recuperer un objet en vb excel ??
[DELPHI] récupérer le nom d'un fichier ...[Delphi] Recuperer des valeurs contenues dans une page web
Plus de sujets relatifs à : Comment recupérer de l'espace disque en C?


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