[C] Copier un fichier octet par octet dans un tableau

Copier un fichier octet par octet dans un tableau [C] - C - Programmation

Marsh Posté le 24-05-2006 à 20:52:07    

:hello:  
 
Voilà pour mes TIPE je cherche à programmer un compresseur de BMP en JPEG, le seul problème est que j'aimerai copié un fichier bmp octet par octet dans un tableau et que je ne vois même pas quelle fonction utiliser.
 
J'espère que vous saurez éclairer ma lanterne
 
Merci d'avance  :jap:

Reply

Marsh Posté le 24-05-2006 à 20:52:07   

Reply

Marsh Posté le 24-05-2006 à 20:55:23    

memcpy

Reply

Marsh Posté le 24-05-2006 à 21:15:26    

Ben je dois pas savoir m'en servir alors...  
Parce que je vois vraiment pas comment l'appliquer au cas présent.
Voilà mon code :

Code :
  1. int ouvrir_fichier(char *file,int *image)
  2. {
  3.     FILE *fichier;
  4.     int *tab;
  5.    
  6.     //Ouverture du fichier
  7.     fichier=fopen(file,"rb+" );
  8.     if(!fichier)
  9.     {
  10.                 printf("Erreur d'ouverture du fichier" );
  11.                 exit(-1);
  12.     }
  13.     //Traitement du fichier
  14.  
  15.                        
  16. }


 
Le but étant de copier chaque octet de "fichier" dans "tab"
Mais alors avec memcpy à part faire

Code :
  1. memcpy(tab,fichier,SIZE);


Je vois pas, et ça, ça n'a pas l'air de fonctionner ...

Reply

Marsh Posté le 24-05-2006 à 21:16:30    

fread

Reply

Marsh Posté le 24-05-2006 à 21:24:02    

Je dois vraiment être idiot parce que je vois toujours pas comment mettre ça en place.
en fait j'aimerai faire ça :

Code :
  1. while(!feof(fichier))
  2.     {
  3.                          fread(mem,1,SIZE,fichier);
  4.                          tab[i]=mem;
  5.                          printf("%ld",tab[i]);
  6.                          i++;
  7.     }


 
Mais ça existe pas  :lol:

Message cité 1 fois
Message édité par Arry le 24-05-2006 à 21:26:32
Reply

Marsh Posté le 24-05-2006 à 21:28:10    

Arry a écrit :

Voilà pour mes TIPE je cherche à programmer un compresseur de BMP en JPEG, le seul problème est que j'aimerai copié un fichier bmp octet par octet dans un tableau et que je ne vois même pas quelle fonction utiliser.


Ouvrir en mode binaire, puis :  

  • par octet : fgetc()
  • par bloc : fread()

Il n'est pas interdit d'ouvrir un livre de C de temps en temps...


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

Marsh Posté le 24-05-2006 à 21:57:56    

#
fread(tab[i],1,SIZE,fichier);
 
remue toi bon sang !

Message cité 1 fois
Message édité par Taz le 24-05-2006 à 21:58:06
Reply

Marsh Posté le 24-05-2006 à 23:31:07    

Arry a écrit :

Code :
  1. while(!feof(fichier))



 
feof() ne sert pas à détecter la fin d'un fichier. Pour ça, on vérifie la valeur renvoyée par la fonction de lecture. Cette valeur est souvent "0" quand la fonction ne lit plus rien.
feof() sert, une fois qu'on ne lit plus rien, à te dire si tu ne lis plus rien à cause de "eof" ou pas.
Comme le dit Emmanuel, tu devrais ouvrir plus souvent ton bouquin de C...
 

Taz a écrit :

fread(tab[i],1,SIZE,fichier);


"tab[i]" ? t'es sûr ?
Moi j'aurais plutôt mis "tab + i"...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 24-05-2006 à 23:34:04    

[HS] C'est une impression où tu commences tes TIPE le 24/05, soit un mois et demi avant l'oral ?[/HS]

Reply

Marsh Posté le 24-05-2006 à 23:45:48    

les TIPE c'est un mystere pour personne que ça se fait entre les écrits et les oraux!
mais c'est vrai qu'il s'y prend un peu tôt, tu as raison.

Reply

Marsh Posté le 24-05-2006 à 23:45:48   

Reply

Marsh Posté le 25-05-2006 à 00:10:47    

Tu peux lire d'abord la taille du fichier, ensuite allouer un tableau de la taille du fichier et ensuite lire le fichier d'un seul coup dans le tableau avec fread : fread(tab, 1, SIZE, f);
(a l'air fatigué Taz  :sleep: )


Message édité par Trap D le 25-05-2006 à 00:12:18
Reply

Marsh Posté le 25-05-2006 à 00:16:08    

Ok merci pour vos réponses rapides je vais essayer de me débrouiller avec ça et avec le seul pauvre livre de C que j'ai.
 
 
[HS] Je suis en prépa intégré... les TIPE c'est pas la même fonction qu'en Prépa classiques [/HS]

Reply

Marsh Posté le 25-05-2006 à 00:17:14    

Et c'est quoi ce livre ?

Reply

Marsh Posté le 25-05-2006 à 03:21:16    

Language C

Message cité 1 fois
Message édité par Arry le 25-05-2006 à 03:21:28
Reply

Marsh Posté le 25-05-2006 à 08:57:50    


Pourtant sur la couverture, il y a écrit "Langage C" C'est une erreur ?  :)  
 
Sinon, c'est pas mal comme livre, mais le Braquelaire est encore mieux. La référence restant évidemment le K&R2

Message cité 1 fois
Message édité par Emmanuel Delahaye le 25-05-2006 à 09:02:19

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

Marsh Posté le 25-05-2006 à 09:39:14    

Arry a écrit :

Ok merci pour vos réponses rapides je vais essayer de me débrouiller avec ça et avec le seul pauvre livre de C que j'ai.


Cours de C gratuit et ptet pas parfait mais au-moins honorable ici
http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf
Autre cours online ici :http://mapage.noos.fr/emdel
 
PS: Stocker tout un fichier complet dans un tableau (mémoire vive) n'est peut-être pas une très bonne idée. N'oublie pas que ta mémoire a une limite...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-05-2006 à 13:08:24    

Emmanuel Delahaye a écrit :

Pourtant sur la couverture, il y a écrit "Langage C" C'est une erreur ?  :)  
 
Sinon, c'est pas mal comme livre, mais le Braquelaire est encore mieux. La référence restant évidemment le K&R2


 
Nan c'est juste que c'est surtout un bouquins pour les programmeurs qui ne sont plus débutants... Pas super abordable pour moi étant donné que j'ai appris ce qu'était un pointeur y'a 4 jours.

Reply

Marsh Posté le 25-05-2006 à 13:11:49    

Ça fait un peu court effectivement, ça ira mieux dans 180 jours intensifs (et encore ....)

Reply

Marsh Posté le 25-05-2006 à 13:11:54    

Sve@r a écrit :

Cours de C gratuit et ptet pas parfait mais au-moins honorable ici
http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf
Autre cours online ici :http://mapage.noos.fr/emdel
 
PS: Stocker tout un fichier complet dans un tableau (mémoire vive) n'est peut-être pas une très bonne idée. N'oublie pas que ta mémoire a une limite...


 
 
Oki merci :)
Pour ce qui est de stocker tout un fichier dans un tableau, c'est pas vraiment le cas, pour l'instant j'aimerai apprendre comment ça marche, mais après je compte m'en servir pour appliquer la DCT à une Matrice de 8*8 pixels, donc je ne vais copier que 16pixels à la fois.

Reply

Marsh Posté le 25-05-2006 à 13:19:09    

Arry a écrit :

Pour ce qui est de stocker tout un fichier dans un tableau, c'est pas vraiment le cas, pour l'instant j'aimerai apprendre comment ça marche, mais après je compte m'en servir pour appliquer la DCT à une Matrice de 8*8 pixels, donc je ne vais copier que 16pixels à la fois.


Alors ce sera parfaitement et trivialement faisable (quoique moi j'aurais plutôt pensé que la matrice faisait "64" pixels mais je suis pas un pro du bmp :sol:)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-05-2006 à 13:35:18    

Sve@r a écrit :

Alors ce sera parfaitement et trivialement faisable (quoique moi j'aurais plutôt pensé que la matrice faisait "64" pixels mais je suis pas un pro du bmp :sol:)


 
Ouai hein qui t'as dis que 8x8 ça fesait 64 toi   :sarcastic:

Reply

Marsh Posté le 25-05-2006 à 13:46:26    

Bon bah j'ai trouvé, la solution était sous mes yeux depuis le début:

Code :
  1. tab[i]=fgetc(fichier);
  2. i++;


 
Merci à tous pour avoir essayer de répondre à ma question conne :)

Message cité 1 fois
Message édité par Arry le 25-05-2006 à 13:47:25
Reply

Marsh Posté le 25-05-2006 à 13:51:40    

Arry a écrit :

Ouai hein qui t'as dis que 8x8 ça fesait 64 toi   :sarcastic:


Tu devrais éviter le smiley "sarcastic" car il est assez insultant et je sais pas trop comment le prendre...
 

Arry a écrit :

Bon bah j'ai trouvé, la solution était sous mes yeux depuis le début:

Code :
  1. tab[i]=fgetc(fichier);
  2. i++;



 
Lire octet par octet c'est assez long (même s'il y a des buffers)
fread(tab, 1, SIZE, fichier) te stockera dans "tab" les "SIZE" octets non déjà lus de ton fichier (Taz l'a déjà dit)

Message cité 1 fois
Message édité par Sve@r le 25-05-2006 à 13:55:47

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-05-2006 à 15:19:24    

Tu connais la structure d'un fichier bitmap ?
 
Wikipedia te donnera la réponse car il faut déjà que tu récup les pixels etc et un bitmap il y a qq infos avant d'avoir les pixels. :)

Reply

Marsh Posté le 25-05-2006 à 17:01:23    

Je@nb a écrit :

Tu connais la structure d'un fichier bitmap ?
 
Wikipedia te donnera la réponse


Peut être... En attendant : wotsit


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

Marsh Posté le 25-05-2006 à 19:01:59    

Niveau théorie sur la compression et les fichier bitmap c'est bon :D
Et pour le fread j'ai bien essayer votre methode mais ca me fait un jolie erreur windows si je met SIZE<30000 donc je comprend pas très bien
 

Sve@r a écrit :

Tu devrais éviter le smiley "sarcastic" car il est assez insultant et je sais pas trop comment le prendre...


 
Le prend pas mal, c'était pas mon intention :)

Message cité 1 fois
Message édité par Arry le 25-05-2006 à 19:08:56
Reply

Marsh Posté le 25-05-2006 à 19:05:36    

Arry a écrit :

Niveau théorie sur la compression et les fichier bitmap c'est bon :D
Et pour le fread j'ai bien essayer votre methode mais ca me fait un jolie erreur windows si je met SIZE<30000 donc je comprend pas très bien


Je soupçonne la définition d'un gros tableau local... Les gros tableaux doivent être définis de manière dynamique...  
 
Sinon, si j'ai bien lu, dans ton code, tu n'as jamais indiqué comment était défini 'tab' (ou le bloc pointé par 'tab').

Message cité 1 fois
Message édité par Emmanuel Delahaye le 25-05-2006 à 19:15:30

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

Marsh Posté le 25-05-2006 à 19:10:31    

Emmanuel Delahaye a écrit :

Je soupçonne la définition d'un gros tableau local... Les gros tableaux doivent être définis de manière dynamique...  
 
Sinon, si j'ai bien lu, dans ton code, tu n'a jamais indiqué comment était défini tab (ou le bloc pointé par tab).


 

Code :
  1. int *tab;


 
je l'avais définit comme ça pour le fread
 
Mais en fait si je fais ça avec un fgetc j'ai juste à utiliser un tableau tout con.

Reply

Marsh Posté le 25-05-2006 à 19:14:06    

Arry a écrit :

Code :
  1. int *tab;


je l'avais définit comme ça pour le fread


Alors j'ai raté le moment où tu fais pointer 'tab' sur un bloc valide... Tu peux montrer ce code ? A ne pas poster tout le code, on devient méfiant, désolé...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 25-05-2006 à 19:16:25

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

Marsh Posté le 25-05-2006 à 19:20:57    

Emmanuel Delahaye a écrit :

Alors j'ai raté le moment où tu fais pointer 'tab' sur un bloc valide... Tu peux montrer ce code ? A ne pas poster tout le code, on devient méfiant, désolé...


 

Code :
  1. int ouvrir_fichier(char *file,int *image)
  2. {
  3.     FILE *fichier;
  4.     int *tab;
  5.     tab=malloc(200*sizeof(int));
  6.     int i=0;
  7.    
  8.    
  9.     //Ouverture du fichier
  10.     fichier=fopen(file,"rb+" );
  11.     if(!fichier)
  12.     {
  13.                 printf("Erreur d'ouverture du fichier" );
  14.                 exit(-1);
  15.     }
  16.     //Traitement du fichier
  17.     while(i<100)
  18.     {
  19.                 fread(tab+i,1,1,fichier);
  20.                 i++;
  21.     }
  22.     printf("%ld" ,tab[60]);
  23.                        
  24. }


 
Bon voilà le code complet
je fais un printf de tab[60] car l'image que j'utilise comme test à un octet=128 à cet endroit
(ça marche avec un fgetc mais c'est très lent...)
 
EDIT : j'ai trouvé l'erreur et j'ai éditer le code... j'avais malheureusement oublier un malloc et SIZE etait trop grand :D


Message édité par Arry le 25-05-2006 à 19:23:45
Reply

Marsh Posté le 25-05-2006 à 19:26:46    

Code :
  1. int * tab = malloc(size * sizeof *tab);
  2. fread(tab, sizeof *tab, size, fichier);

Message cité 1 fois
Message édité par skelter le 25-05-2006 à 19:27:55
Reply

Marsh Posté le 25-05-2006 à 19:30:43    

Arry a écrit :

Code :
  1. int *tab;


 
je l'avais définit comme ça pour le fread
 
Mais en fait si je fais ça avec un fgetc j'ai juste à utiliser un tableau tout con.


Même avec un "fread", tu utiliseras aussi un tableau tout con
 
Il faut bien que tu fasses la nuance entre
- ce que la fonction veut
- ce que tu définis
 
Tu lis la doc de "fread" et tu vois "fread(char *buffer, ...)" donc tu définis un "char *tab" et tu fais "fread(tab, ...)" et c'est là que t'as tout faux
 
Ta fonction attend un "char *" donc un pointeur sur un caractère donc l'adresse d'un caractère. Mais il faut que toi, tu lui passes une adresse valide, c'est à dire une adresse où il y aura assez de place pour stocker "x" caractères.
Donc soit tu écris

  • char *tab => tu as "tab" qui contient une valeur aléatoire et à l'adresse représentée par cette valeur, tu ira stocker des caractères => ces caractères seront stockés n'importe-où => gros pb
  • char tab[10000] => là, tu as "tab" qui contient une adresse réservée où tu peux stocker "10000" caractères


Dans les 2 définitions, "tab" est toujours un "char *" donc tu pourras toujours faire "fread(tab, ...)"
 
PS: Dans la 1ère définition, pour pouvoir mettre qqchose dans "tab", il faut commencer par "allouer" de la mémoire avec "malloc" et récupérer l'adresse renvoyée par "malloc()" pour pouvoir t'en servir => tab=malloc(n); puis une fois que t'as plus besoin de "tab", libérer la mémoire allouée avec "free" => free(tab)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 25-05-2006 à 19:36:33    

le premier parametre de fread est de type 'void *', ca veut dire que fread attend une adresse a partir de laquelle les données seront ecrites en memoire
 

Citation :

Dans les 2 définitions, "tab" est toujours un "char *" donc tu pourras toujours faire "fread(tab, ...)"


 
dans la 2e tab est un tableau ? c'est juste que l'adresse de ce tableau (adresse d'un char si tableau de char) est typée 'char *' et peut etre contenue par un pointeur sur char

Reply

Marsh Posté le 25-05-2006 à 19:39:46    

skelter a écrit :

Code :
  1. int * tab = malloc(size * sizeof *tab);
  2. fread(tab, sizeof *tab, size, fichier);



là j'ai pas compris l'interet
 

Sve@r a écrit :

Même avec un "fread", tu utiliseras aussi un tableau tout con
 
Il faut bien que tu fasses la nuance entre
- ce que la fonction veut
- ce que tu définis
 
Tu lis la doc de "fread" et tu vois "fread(char *buffer, ...)" donc tu définis un "char *tab" et tu fais "fread(tab, ...)" et c'est là que t'as tout faux
 
Ta fonction attend un "char *" donc un pointeur sur un caractère donc l'adresse d'un caractère. Mais il faut que toi, tu lui passes une adresse valide, c'est à dire une adresse où il y aura assez de place pour stocker "x" caractères.
Donc soit tu écris

  • char *tab => tu as "tab" qui contient une valeur aléatoire et à l'adresse représentée par cette valeur, tu ira stocker des caractères => ces caractères seront stockés n'importe-où => gros pb
  • char tab[10000] => là, tu as "tab" qui contient une adresse réservée où tu peux stocker "10000" caractères


Dans les 2 définitions, "tab" est toujours un "char *" donc tu pourras toujours faire "fread(tab, ...)"
 
PS: Dans la 1ère définition, pour pouvoir mettre qqchose dans "tab", il faut commencer par "allouer" de la mémoire avec "malloc" et récupérer l'adresse renvoyée par "malloc()" pour pouvoir t'en servir => tab=malloc(n); puis une fois que t'as plus besoin de "tab", libérer la mémoire allouée avec "free" => free(tab)


Merci beaucoups ça m'eclaire sur l'utilisation du malloc dont je n'avais pas compris l'interet :)

Reply

Marsh Posté le 25-05-2006 à 19:45:21    

Arry a écrit :

là j'ai pas compris l'interet


 
ca rempli le tableau a partir du fichier, ton code etait faux (en plus de la boucle inutile)
 

Code :
  1. //Traitement du fichier
  2.        while(i<100)
  3.        {
  4.                    fread(tab+i,1,1,fichier);
  5.                    i++;
  6.        }

Reply

Marsh Posté le 25-05-2006 à 19:53:14    

skelter a écrit :

ca rempli le tableau a partir du fichier, ton code etait faux (en plus de la boucle inutile)
 

Code :
  1. //Traitement du fichier
  2.        while(i<100)
  3.        {
  4.                    fread(tab+i,1,1,fichier);
  5.                    i++;
  6.        }



 
Ben je sais pas si je remplace 100 par 6 ça remplie très bien les 6 première colonne de mon tab, ce qui sert à calculer la taille du fichier, celle-ci etant coder sur le 3,4,5et6eme octet

Reply

Marsh Posté le 25-05-2006 à 19:57:20    

ca n'empeche que la boucle est inutile et dangereuse (la preuve) et tab est de type 'int *' alors si sizeof(int) > 1 ton fread(..., 1, 1, ...) ne lira que un byte dans l'element courant (d'adresse tab+i)

Reply

Marsh Posté le 25-05-2006 à 20:05:23    

Bah c'est ce que je cherche à faire puisque je veux mettre 6bytes, chacune dans tab[0]...tab[5]
et ma boucle marche très bien :D

Reply

Marsh Posté le 25-05-2006 à 20:07:22    

pourquoi tab n'est pas un 'char *' ?


Message édité par skelter le 25-05-2006 à 20:07:35
Reply

Marsh Posté le 25-05-2006 à 20:13:09    

Bah je sais pas à vrai dire, comme je veux des nombres je me suis dis que int ça irai très bien ...
 
skelter pourquoi quand j'utilise ta methode mes "128" ce transforment tous en "-128" ?

Message cité 1 fois
Message édité par Arry le 25-05-2006 à 20:22:16
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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