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

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

Marsh Posté le 06-10-2003 à 20:06:57    

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?

Reply

Marsh Posté le 06-10-2003 à 20:06:57   

Reply

Marsh Posté le 06-10-2003 à 20:07:42    

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


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 06-10-2003 à 20:08:12    

skeye a écrit :

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


 
Ben post nous ton code, pour voir :D

Reply

Marsh Posté le 06-10-2003 à 20:09:00    

chrisbk a écrit :


 
Ben post nous ton code, pour voir :D


tsssss


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 06-10-2003 à 20:09:56    


 
he ben ? il arrive oui ? :O

Reply

Marsh Posté le 06-10-2003 à 20:22:09    

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. }

Reply

Marsh Posté le 06-10-2003 à 20:25:27    

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)

Reply

Marsh Posté le 06-10-2003 à 20:30:47    

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?

Reply

Marsh Posté le 06-10-2003 à 20:41:02    

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.

Reply

Marsh Posté le 06-10-2003 à 20:53:13    

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

Reply

Marsh Posté le 06-10-2003 à 20:53:13   

Reply

Marsh Posté le 06-10-2003 à 21:10:56    

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

Reply

Marsh Posté le 06-10-2003 à 21:29:14    

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 !

Reply

Marsh Posté le 07-10-2003 à 06:16:53    

man truncate

Reply

Marsh Posté le 07-10-2003 à 08:44:57    

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

Marsh Posté le 07-10-2003 à 08:58:31    

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
Reply

Marsh Posté le 07-10-2003 à 09:28:37    

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:

Reply

Marsh Posté le 07-10-2003 à 10:26:24    

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

Marsh Posté le 07-10-2003 à 12:16:13    

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
Reply

Marsh Posté le 07-10-2003 à 12:46:31    

ç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
Reply

Marsh Posté le 07-10-2003 à 12:49:10    

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]
 

Reply

Marsh Posté le 07-10-2003 à 13:06:06    

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
Reply

Marsh Posté le 07-10-2003 à 18:29:32    

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. :)  
 

Reply

Marsh Posté le 07-10-2003 à 19:45:29    

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

Reply

Marsh Posté le 07-10-2003 à 19:48:00    

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]

Reply

Marsh Posté le 07-10-2003 à 19:50:22    

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 ^_^
Reply

Marsh Posté le 07-10-2003 à 19:58:23    

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 ?

Reply

Marsh Posté le 07-10-2003 à 20:11:48    

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

Reply

Marsh Posté le 09-10-2003 à 01:00:53    

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

Marsh Posté le 09-10-2003 à 01:20:57    

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
Reply

Marsh Posté le 09-10-2003 à 09:21:29    

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

Marsh Posté le 09-10-2003 à 11:11:49    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed