salut tout le monde, j'aurais voulu savoir quand on ouvre un fichier en lecture binaire, comment on peut lire un bit (et je dis bien un bit et non un octet) avec fread par exemple.
En fait je voudrais faire ça pour faire un petit script de compressage (sans prétention, juste pour voir comment faire), et mon idée est de lire le fichier bit par bit et si par exemple on a 3 bit 1 à la suite dans le fichier de destination j'ecrirai 31 au lieu de 111 par exemple.
Mais si ce n'est aps comme ça que je devrais faire est-ce que vous pourriez me mettre sur la piste?
Merci d'avance
PS => j'ai une petite question à part: pourquoi quand on écrit dans un fichier en écriture binaire, on ne peut pas lire le fichier avec un éditeur normal?
Alors la mauvaise nouvelle :
On ne peut pas lire/ecrire un seul bit dans un fichier.
Il faut toujours lire au moins un octet.
Cependant, tu as raison : les logiciels de compression descendent au niveau du "bit" pour compresser au maximum.
Mais ils passent par un buffer en RAM pour ça.
Quand ils lisent un fichier : ils lisent des octets, puis, une fois en RAM, recuperent les bits avec des masques et des opérateurs comme il faut (& | << >> ~)
Pour écrire un fichier bit par bit : prévois toi un petit buffer en RAM, ajoute tes bits dans ce buffer avec les memes opérateurs, puis, quand ton buffer (qui par hasard fait un nombre rond en octets) est plein, tu l'écris sur le disque.
Sinon, pour ta question d'apres :
Parce qu'en binaire, tu peux avoir tous les codes ASCII possibles, de 00 à FF, et qu'au format texte, certaines de ces données sont réservées, et si elles sont écrites en tant que texte, le notepad les interpretera comme des retour a la ligne (caracteres 0x0D et 0x0A) ou autres trucs comme ça
Il te faut un éditeur Hexa pour bien lire un fichier binaire.
Ok merci pour tes réponses, par contre je ne vois pas exactement comment faire un buffer en RAM, est-ce que tu pourrais m'en dire un peu plus sur la façon de procèder?
Ok merci pour tes réponses, par contre je ne vois pas exactement comment faire un buffer en RAM, est-ce que tu pourrais m'en dire un peu plus sur la façon de procèder?
Ok mais serait il possible d'avoir un exemple simple de la manière de procéder pour faire ça:
"Quand ils lisent un fichier : ils lisent des octets, puis, une fois en RAM, recuperent les bits avec des masques et des opérateurs comme il faut (& | << >> ~)
Pour écrire un fichier bit par bit : prévois toi un petit buffer en RAM, ajoute tes bits dans ce buffer avec les memes opérateurs, puis, quand ton buffer (qui par hasard fait un nombre rond en octets) est plein, tu l'écris sur le disque. "
Aussi j'ai une autre question du même ordre qui me trotte dans la tête depuis quelques minutes:
Si je veux mettre tout le contenu d'un fichier (qui est assez gros => 19 000 ko) dans une variable (donc dans la RAM), quel genre de variable je dois prendre et comment je dois m'y prendre pour tout mettre dans la RAM? (c'est un peu obscur encore pour moi, et j'aimerais y voir plus clair)
pour un buffer, tu peux simplement prendre un octet comme buffer
char buf;
et un "curseur"
int pos = 0;
quand tu vas ajouter un bit, avec des opérations de masque, tu ajoutes le bit ou il faut, puis tu fais pos++
quand pos vaut 8, alors ça veut dire que ton octet est plein : tu le fwrite dans ton fichier, et tu le remets a 0
POur allouer beaucoup de mémoire contigüe (idéal pour un fichier)
char* buf = (char*)malloc(taille);
-> tu te crées unz one de la taille que tu veux.
(certains diront qu'on ne caste pas le malloc en C pure... bah...)
Donc pour le buffer de RAM j'ai compris merci
Par contre est-ce que tu pourrais m'en dire plus sur les opérations de masque, qui servent à "isolé" un bit de l'octet?
Et aussi en fait pour mettre 8 bits dans un octet je ne vois pas trop bien comment il faut faire: est-ce qu'il faudrait faire buf += bit; ou buf = bit; ou autre choses encore?
Sinon pour le fichier j'ai compris merci.
Et j'aurais encore une petite question: quand on a une variable char qui contient un octet, pour faire des opérations héxadécimales ou binaire avec ce char comment est-ce qu'on fait?
Merci d'avance
PS => à oui et pour avoir al taille d'un fichier il existe une fonction simple ou bien elle est dans dans une autre bibliothèque? Si oui pourrait on me dire laquelle?
Merci de ta réponse, j'ai compris maintenant, et puis je viens de voir aussi un cours apprenant ça: http://209.85.135.104/search?q=cache:stfozQ3q3h8J:cplusplus.cdoc.biz/download_fichier.php%3Ff%3D2%25201%2520operateurs%252013.pdf+comment+remplir+un+nombre+int+octet+par+octet+C&hl=fr&ct=clnk&cd=19&gl=fr&client=firefox-a
Merci pour ce code
J'ai réussi à faire un petit compresseur, et pour le fichier sur lequel j'ai essayé le taux de compressage était de 44% environ, ce qui n'est pas mal pour ce que je veux faire
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html