Copier un fichier octet par octet dans un tableau [C] - C - Programmation
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 :
|
Le but étant de copier chaque octet de "fichier" dans "tab"
Mais alors avec memcpy à part faire
Code :
|
Je vois pas, et ça, ça n'a pas l'air de fonctionner ...
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 :
|
Mais ça existe pas
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 :
Il n'est pas interdit d'ouvrir un livre de C de temps en temps...
Marsh Posté le 24-05-2006 à 21:57:56
#
fread(tab[i],1,SIZE,fichier);
remue toi bon sang !
Marsh Posté le 24-05-2006 à 23:31:07
Arry a écrit :
|
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"...
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]
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.
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 )
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]
Marsh Posté le 25-05-2006 à 03:21:16
ReplyMarsh 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
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...
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 ? |
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.
Marsh Posté le 25-05-2006 à 13:11:49
Ça fait un peu court effectivement, ça ira mieux dans 180 jours intensifs (et encore ....)
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 |
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.
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 )
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 ) |
Ouai hein qui t'as dis que 8x8 ça fesait 64 toi
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 :
|
Merci à tous pour avoir essayer de répondre à ma question conne
Marsh Posté le 25-05-2006 à 13:51:40
Arry a écrit : Ouai hein qui t'as dis que 8x8 ça fesait 64 toi |
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:
|
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)
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.
Marsh Posté le 25-05-2006 à 17:01:23
Je@nb a écrit : Tu connais la structure d'un fichier bitmap ? |
Peut être... En attendant : wotsit
Marsh Posté le 25-05-2006 à 19:01:59
Niveau théorie sur la compression et les fichier bitmap c'est bon
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
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 |
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').
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... |
Code :
|
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.
Marsh Posté le 25-05-2006 à 19:14:06
Arry 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é...
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 :
|
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
Marsh Posté le 25-05-2006 à 19:26:46
Code :
|
Marsh Posté le 25-05-2006 à 19:30:43
Arry 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
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)
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
Marsh Posté le 25-05-2006 à 19:39:46
skelter a écrit :
|
là j'ai pas compris l'interet
Sve@r a écrit : Même avec un "fread", tu utiliseras aussi un tableau tout con
|
Merci beaucoups ça m'eclaire sur l'utilisation du malloc dont je n'avais pas compris l'interet
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 :
|
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)
|
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
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)
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
Marsh Posté le 25-05-2006 à 20:07:22
pourquoi tab n'est pas un 'char *' ?
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" ?
Marsh Posté le 24-05-2006 à 20:52:07
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