Comment recupérer de l'espace disque en C? - C - Programmation
Marsh Posté le 06-10-2003 à 20:07:42
Tu effaces "aa" du fichier...
Marsh Posté le 06-10-2003 à 20:08:12
ReplyMarsh Posté le 06-10-2003 à 20:09:00
chrisbk a écrit : |
tsssss
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 :
|
Marsh Posté le 06-10-2003 à 20:25:27
superbe exemple de clareté, lisibilité et concision
(en tout cas tu viens de demontré l'interet des exceptions, dommage que tu sois en C )
Marsh Posté le 06-10-2003 à 20:30:47
chrisbk a écrit : superbe exemple de clareté, lisibilité et concision |
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?
Marsh Posté le 06-10-2003 à 20:41:02
skeye a écrit : |
Tout le problème est là .
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.
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
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
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 !
Marsh Posté le 07-10-2003 à 08:44:57
Je dirais meme plus:
#include <unistd.h> |
A+,
Marsh Posté le 07-10-2003 à 08:58:31
gilou a écrit : Je dirais meme plus:
|
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"
Marsh Posté le 07-10-2003 à 09:28:37
chrisbk a écrit : superbe exemple de clareté, lisibilité et concision |
mdr:lol:
Marsh Posté le 07-10-2003 à 10:26:24
El_gringo 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+,
Marsh Posté le 07-10-2003 à 12:16:13
gilou a écrit : |
oui mais posix, c'est pas iso non plus
Edit : me suis mal exprimé, "posix ca ne vaut pas l'iso" vala
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
Marsh Posté le 07-10-2003 à 12:49:10
dew a écrit : ça ne sert strictement à rien de faire ça |
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
Marsh Posté le 07-10-2003 à 13:06:06
chrisbk a écrit : |
Il peut aussi augmenter la taille de son fichier afin d'utiliser l'espace allouer de façon plus optimale
Marsh Posté le 07-10-2003 à 18:29:32
Matafan a écrit :
|
C'est exactement ce que je cherchais
Merci beaucoup.
La raison pour laquelle je voulai changer la taille c'est juste par ce que j'utilise
Code :
|
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.
Marsh Posté le 07-10-2003 à 19:48:00
chrisbk a écrit : superbe exemple de clareté, lisibilité et concision |
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
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+
Marsh Posté le 07-10-2003 à 19:58:23
MagicBuzz a écrit : |
Vu que n'importe quel langage te permet de faire des atrocités, tu programme en quoi ?
Marsh Posté le 07-10-2003 à 20:11:48
chrisbk a écrit : |
je fais du VB (mine de rien, même un programme porc en VB reste bien plus lisible qu'un programme porc en C )
nan, sinon moi je veux faire de l'ADA
lui au moins, t'as pas le droit à un pet de travers...
Marsh Posté le 09-10-2003 à 01:00:53
MagicBuzz a écrit : |
MB, la prochaine fois que je te prends a troller comme un porc, ca va etre un TT de une semaine.
A+,
Marsh Posté le 09-10-2003 à 01:20:57
gilou 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é ).
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...
Marsh Posté le 09-10-2003 à 09:21:29
ToxicAvenger a écrit : |
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+,
Marsh Posté le 06-10-2003 à 20:06:57
Bonjour,
j'ai une question qui pour beaucoup semblera sans doute stupide .
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?