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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

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

n°1374580
Arry
Posté le 24-05-2006 à 20:52:07  profilanswer
 

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

mood
Publicité
Posté le 24-05-2006 à 20:52:07  profilanswer
 

n°1374583
Taz
bisounours-codeur
Posté le 24-05-2006 à 20:55:23  profilanswer
 

memcpy

n°1374598
Arry
Posté le 24-05-2006 à 21:15:26  profilanswer
 

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

n°1374600
Taz
bisounours-codeur
Posté le 24-05-2006 à 21:16:30  profilanswer
 

fread

n°1374604
Arry
Posté le 24-05-2006 à 21:24:02  profilanswer
 

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
n°1374609
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-05-2006 à 21:28:10  profilanswer
 

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/
n°1374633
Taz
bisounours-codeur
Posté le 24-05-2006 à 21:57:56  profilanswer
 

#
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
n°1374697
Sve@r
Posté le 24-05-2006 à 23:31:07  profilanswer
 

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.
n°1374698
fhr
Posté le 24-05-2006 à 23:34:04  profilanswer
 

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

n°1374704
subtil
Posté le 24-05-2006 à 23:45:48  profilanswer
 

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.

mood
Publicité
Posté le 24-05-2006 à 23:45:48  profilanswer
 

n°1374716
Trap D
Posté le 25-05-2006 à 00:10:47  profilanswer
 

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
n°1374719
Arry
Posté le 25-05-2006 à 00:16:08  profilanswer
 

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]

n°1374720
Trap D
Posté le 25-05-2006 à 00:17:14  profilanswer
 

Et c'est quoi ce livre ?

n°1374747
Arry
Posté le 25-05-2006 à 03:21:16  profilanswer
 

Language C

Message cité 1 fois
Message édité par Arry le 25-05-2006 à 03:21:28
n°1374758
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2006 à 08:57:50  profilanswer
 


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/
n°1374762
Sve@r
Posté le 25-05-2006 à 09:39:14  profilanswer
 

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.
n°1374875
Arry
Posté le 25-05-2006 à 13:08:24  profilanswer
 

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.

n°1374877
Trap D
Posté le 25-05-2006 à 13:11:49  profilanswer
 

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

n°1374878
Arry
Posté le 25-05-2006 à 13:11:54  profilanswer
 

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.

n°1374880
Sve@r
Posté le 25-05-2006 à 13:19:09  profilanswer
 

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.
n°1374891
Arry
Posté le 25-05-2006 à 13:35:18  profilanswer
 

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:

n°1374895
Arry
Posté le 25-05-2006 à 13:46:26  profilanswer
 

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
n°1374900
Sve@r
Posté le 25-05-2006 à 13:51:40  profilanswer
 

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.
n°1374934
Je@nb
Kindly give dime
Posté le 25-05-2006 à 15:19:24  profilanswer
 

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

n°1374974
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2006 à 17:01:23  profilanswer
 

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/
n°1375024
Arry
Posté le 25-05-2006 à 19:01:59  profilanswer
 

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
n°1375026
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2006 à 19:05:36  profilanswer
 

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/
n°1375029
Arry
Posté le 25-05-2006 à 19:10:31  profilanswer
 

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.

n°1375030
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-05-2006 à 19:14:06  profilanswer
 

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/
n°1375034
Arry
Posté le 25-05-2006 à 19:20:57  profilanswer
 

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
n°1375037
skelter
Posté le 25-05-2006 à 19:26:46  profilanswer
 

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
n°1375040
Sve@r
Posté le 25-05-2006 à 19:30:43  profilanswer
 

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.
n°1375047
skelter
Posté le 25-05-2006 à 19:36:33  profilanswer
 

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

n°1375049
Arry
Posté le 25-05-2006 à 19:39:46  profilanswer
 

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

n°1375052
skelter
Posté le 25-05-2006 à 19:45:21  profilanswer
 

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

n°1375057
Arry
Posté le 25-05-2006 à 19:53:14  profilanswer
 

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

n°1375060
skelter
Posté le 25-05-2006 à 19:57:20  profilanswer
 

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)

n°1375066
Arry
Posté le 25-05-2006 à 20:05:23  profilanswer
 

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

n°1375069
skelter
Posté le 25-05-2006 à 20:07:22  profilanswer
 

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


Message édité par skelter le 25-05-2006 à 20:07:35
n°1375073
Arry
Posté le 25-05-2006 à 20:13:09  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

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

 

Sujets relatifs
Automatiser la copie d'un fichier vers un autre fichierQuel type de Fichier pour fichier avec clé(index)
Petite question sur les tris de tableauMySQL : fichier MYI corrompu
[Vb.Net] Charger fichier 3ds dans une form...??génération de fichier XML à partir d'une base de données SQL ??
charger une image dans un tableau videImport Fichier Excel dans Sql Server
Copier une cellule en conservant toute la mise en formeBATCH DOS :Comment passer les paramètres à partir d'un fichier ?
Plus de sujets relatifs à : [C] Copier un fichier octet par octet dans un tableau


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