Lecture d'un fichier binaire, affichage de unsigned char
Le
fanny Chevalier
--9EDAD36A65A98F26D3D2CAD4
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Bonjour,
Dans le cadre d'un travail sur les images, j'ai besoin de recuperer les
informations
de couleur par canal dans un fichier PPM brut ("P6" et non "P3").
Ainsi, je souhaite recuperer l'ensemble des donnees des couleurs en
lisant
le fichier a la manière du c : fopen (filename, "rb")
Est-ce automatique en C++ si je fais
unsigned char Red, Green, Blue;
input >> Red >> Green >> Blue ;
Si, mettons en ascii j'ai les valeurs :
216
28
13
et je les lis en brut dans le fichier
Aurais-je Red = 216, Green = 28 et Blue = 13 ?
Si c'est le cas, tres bien, maintenant il me reste a verifier les
informations recueillies
(voila pourquoi je n'ai pas pu verifier)
J'enregistre mes donnes dans des unsigned char (je ne changerais pas
c'est la convention)
lorsque je fais
cout << Red << " " << Green << " " << Blue << endl;
J'obtiens des caractères assez spéciaux Comment faire pour obtenir
les valeurs numériques
que je recherche (216 28 13) ?
Merci par avance
--
Fanny
--9EDAD36A65A98F26D3D2CAD4
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
Bonjour,
<p>Dans le cadre d'un travail sur les images, j'ai besoin de recuperer
les informations
<br>de couleur par canal dans un fichier PPM brut ("P6" et non "P3").
<p>Ainsi, je souhaite recuperer l'ensemble des donnees des couleurs en
lisant
<br>le fichier a la manière du c : fopen (filename, "rb")
<p>Est-ce automatique en C++ si je fais
<br>unsigned char Red, Green, Blue;
<br>input >> Red >> Green >> Blue ;
<p>Si, mettons en ascii j'ai les valeurs :
<br>216
<br>28
<br>13
<br>et je les lis en brut dans le fichier
<br>Aurais-je Red = 216, Green = 28 et Blue = 13 ?
<p>Si c'est le cas, tres bien, maintenant il me reste a verifier les informations
recueillies
<br>(voila pourquoi je n'ai pas pu verifier)
<br>J'enregistre mes donnes dans des unsigned char (je ne changerais pas
c'est la convention)
<br>lorsque je fais
<br>cout << Red << " " << Green << " " <<
Blue << endl;
<br>J'obtiens des caractères assez spéciaux Comment faire
pour obtenir les valeurs numériques
<br>que je recherche (216 28 13) ?
<p>Merci par avance
<pre>--
Fanny</pre>
</html>
--9EDAD36A65A98F26D3D2CAD4--
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Bonjour,
Dans le cadre d'un travail sur les images, j'ai besoin de recuperer les
informations
de couleur par canal dans un fichier PPM brut ("P6" et non "P3").
Ainsi, je souhaite recuperer l'ensemble des donnees des couleurs en
lisant
le fichier a la manière du c : fopen (filename, "rb")
Est-ce automatique en C++ si je fais
unsigned char Red, Green, Blue;
input >> Red >> Green >> Blue ;
Si, mettons en ascii j'ai les valeurs :
216
28
13
et je les lis en brut dans le fichier
Aurais-je Red = 216, Green = 28 et Blue = 13 ?
Si c'est le cas, tres bien, maintenant il me reste a verifier les
informations recueillies
(voila pourquoi je n'ai pas pu verifier)
J'enregistre mes donnes dans des unsigned char (je ne changerais pas
c'est la convention)
lorsque je fais
cout << Red << " " << Green << " " << Blue << endl;
J'obtiens des caractères assez spéciaux Comment faire pour obtenir
les valeurs numériques
que je recherche (216 28 13) ?
Merci par avance
--
Fanny
--9EDAD36A65A98F26D3D2CAD4
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
Bonjour,
<p>Dans le cadre d'un travail sur les images, j'ai besoin de recuperer
les informations
<br>de couleur par canal dans un fichier PPM brut ("P6" et non "P3").
<p>Ainsi, je souhaite recuperer l'ensemble des donnees des couleurs en
lisant
<br>le fichier a la manière du c : fopen (filename, "rb")
<p>Est-ce automatique en C++ si je fais
<br>unsigned char Red, Green, Blue;
<br>input >> Red >> Green >> Blue ;
<p>Si, mettons en ascii j'ai les valeurs :
<br>216
<br>28
<br>13
<br>et je les lis en brut dans le fichier
<br>Aurais-je Red = 216, Green = 28 et Blue = 13 ?
<p>Si c'est le cas, tres bien, maintenant il me reste a verifier les informations
recueillies
<br>(voila pourquoi je n'ai pas pu verifier)
<br>J'enregistre mes donnes dans des unsigned char (je ne changerais pas
c'est la convention)
<br>lorsque je fais
<br>cout << Red << " " << Green << " " <<
Blue << endl;
<br>J'obtiens des caractères assez spéciaux Comment faire
pour obtenir les valeurs numériques
<br>que je recherche (216 28 13) ?
<p>Merci par avance
<pre>--
Fanny</pre>
</html>
--9EDAD36A65A98F26D3D2CAD4--

Poser une question


char Red, Green, Blue; // ça ne compilera pas avec 'unsigned char'
input.get(Red).get(Green).get(Blue);
ou bien
std::vector<char> v(3);
input.read(&v.front(), 3);
unsigned char Red=v[0], Green=v[1], Blue=v[2];
ou
std::cout
Falk
|> Dans le cadre d'un travail sur les images, j'ai besoin de recuperer
|> les informations de couleur par canal dans un fichier PPM brut ("P6"
|> et non "P3").
|> Ainsi, je souhaite recuperer l'ensemble des donnees des couleurs en
|> lisant le fichier a la manière du c : fopen (filename, "rb")
Pourquoi ? Ça marche aussi bien en C++, avec un filebuf ou
éventuellement un éventuellement ifstream.
|> Est-ce automatique en C++ si je fais
|> unsigned char Red, Green, Blue;
|> input >> Red >> Green >> Blue ;
Pas du tout. L'opérateur >> c'est l'opérateur de formattage (ou de
déformattage, si on préfère). Il convertit un format externe en
format interne. Et le seul format externe supporté par la norme,
c'est le format texte.
Ce qu'il faut que tu fasses, c'est déterminé quel est le format
réel des données dans le fichier (parce que binaire ne veut rien
dire dans ce contexte, sauf que ce n'est pas du texte), et écrire un
flux (avec ses opérateurs >> et
Le cas des char est un peu spécial -- si tu es certain que tous les
données sont sur des char (pas d'int, etc.), tu pourrais
éventuellement t'en tirer avec la fonction read de istream. Mais en
aucun cas les >>.
|> Si, mettons en ascii j'ai les valeurs :
|> 216
|> 28
|> 13
|> et je les lis en brut dans le fichier
|> Aurais-je Red = 216, Green = 28 et Blue = 13 ?
|> Si c'est le cas, tres bien, maintenant il me reste a verifier les
|> informations recueillies (voila pourquoi je n'ai pas pu verifier)
|> J'enregistre mes donnes dans des unsigned char (je ne changerais
|> pas... c'est la convention)
|> lorsque je fais
|> cout << Red << " " << Green << " " << Blue << endl;
|> J'obtiens des caractères assez spéciaux... Comment faire pour
|> obtenir les valeurs numériques que je recherche (216 28 13) ?
Parce que les flux suppose que tout ce qui est sur un type char sont des
caractères, et les sortent comme des caractères. Il faut lui dire
que ce sont des entiers, p.e. :
cout
--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|> std::cout
Tiens. Voilà une obfuscation que je n'avais jamais encore
rencontrée.
--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
fanny Chevalier wrote:
Merci beaucoup mais j'avais trouvé une solution entre temps.
En effet, les données en brut que je lis sont des unsigned char
donc pas de problèmes en faisant :
ifstream input (filename.c_str());
unsigned char Red, Green, Blue;
input >> Red >> Green >> Blue;
cout << (int) Red << " " << (int) Green << " " << (int) Blue << endl;
me donne bien les données attendues (valeur du canal entre 0 et 255).
--
Fanny
--------------5AF836F20E92174E6119BE4A
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
<html>
fanny Chevalier wrote:
<blockquote TYPE=CITE>Bonjour,
<p>Dans le cadre d'un travail sur les images, j'ai besoin de recuperer
les informations
<p>Ainsi, je souhaite recuperer l'ensemble des donnees des couleurs en
lisant
<br>le fichier a la manière du c : fopen (filename, "rb")
<p>Est-ce automatique en C++ si je fais
<br>unsigned char Red, Green, Blue;
<br>input >> Red >> Green >> Blue ;
<p>Si, mettons en ascii j'ai les valeurs :
<br>216
<br>28
<br>13
<br>et je les lis en brut dans le fichier
<br>Aurais-je Red = 216, Green = 28 et Blue = 13 ?
<p>Si c'est le cas, tres bien, maintenant il me reste a verifier les informations
recueillies
<br>(voila pourquoi je n'ai pas pu verifier)
c'est la convention)
<br>lorsque je fais
<br>cout << Red << " " << Green << " " <<
Blue << endl;
pour obtenir les valeurs numériques
<br>que je recherche (216 28 13) ?
<pre>--
Fanny</pre>
</blockquote>
<br>En effet, les données en brut que je lis sont des unsigned char
<br>donc pas de problèmes en faisant :
<br>unsigned char Red, Green, Blue;
<br>input >> Red >> Green >> Blue;
<br>cout << (int) Red << " " << (int) Green <<
" " << (int) Blue << endl;
<br>me donne bien les données attendues (valeur du canal entre 0
et 255).
<br>-- <br>
Fanny <br>
<BR></html>
--------------5AF836F20E92174E6119BE4A--
donc il faut bien s'en servir de temps en temps :-)
Plus sérieusement, moi aussi je préfère le static_cast, ou le cast
"function style" s'il n'y a pas de pointeurs/références d'impliqués.
Le seul avantage du '+' que je vois, c'est pour convertir un 'char'
en un type intégral préservant la valeur et donnant la valeur numérique
quand on l'envoie sur un std::ostream par ' 'static_cast<unsigned>()' ne convient pas si 'char' est signé sur la
machine ; et static_cast<int>() non plus si 'char' est non signé et
sizeof(int)==1. Le '+' unaire (5.3.1/6) force selon 4.5/1 la promotion
intégrale vers le type Qui Va Bien (tm).
Falk