Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lecture d'un fichier binaire, affichage de unsigned char

6 réponses
Avatar
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&egrave;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 &lt;&lt; Red &lt;&lt; " " &lt;&lt; Green &lt;&lt; " " &lt;&lt;
Blue &lt;&lt; endl;
<br>J'obtiens des caract&egrave;res assez sp&eacute;ciaux... Comment faire
pour obtenir les valeurs num&eacute;riques
<br>que je recherche (216 28 13) ?
<p>Merci par avance...
<pre>--&nbsp;
Fanny</pre>
</html>

--------------9EDAD36A65A98F26D3D2CAD4--

6 réponses

Avatar
Falk Tannhäuser
fanny Chevalier wrote:

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")
std::ifstream input(filename, std::ios::binary);


Est-ce automatique en C++ si je fais
unsigned char Red, Green, Blue;
input >> Red >> Green >> Blue ;
Non, il faut utiliser des opérations dites non-formattées pour lire des données binaires :

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];

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
std::cout << +Red ...

ou
std::cout << unsigned(Red) ...

Falk

Avatar
James Kanze
fanny Chevalier writes:

|> 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 <<) qui le connaît.

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 << static_cast< unsigned >( Red ) ...

--
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
Avatar
James Kanze
Falk Tannhäuser writes:

|> std::cout << +Red ...

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
Avatar
fanny Chevalier
--------------5AF836F20E92174E6119BE4A
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

fanny Chevalier wrote:

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



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

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<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
<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&egrave;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 &lt;&lt; Red &lt;&lt; " " &lt;&lt; Green &lt;&lt; " " &lt;&lt;
Blue &lt;&lt; endl;
<br>J'obtiens des caract&egrave;res assez sp&eacute;ciaux... Comment faire
pour obtenir les valeurs num&eacute;riques
<br>que je recherche (216 28 13) ?
<p>Merci par avance...
<pre>--&nbsp;
Fanny</pre>
</blockquote>

<p><br>Merci beaucoup mais j'avais trouv&eacute; une solution entre temps.
<br>En effet, les donn&eacute;es en brut que je lis sont des unsigned char
<br>donc pas de probl&egrave;mes en faisant :
<br>ifstream input (filename.c_str());
<br>unsigned char Red, Green, Blue;
<br>input >> Red >> Green >> Blue;
<br>cout &lt;&lt; (int) Red &lt;&lt; " " &lt;&lt; (int) Green &lt;&lt;
" " &lt;&lt; (int) Blue &lt;&lt; endl;
<br>me donne bien les donn&eacute;es attendues (valeur du canal entre 0
et 255).
<br>--&nbsp;<br>
Fanny&nbsp;<br>
<BR></html>

--------------5AF836F20E92174E6119BE4A--

Avatar
Falk Tannhäuser
James Kanze wrote:

Falk Tannhäuser writes:

|> std::cout << +Red ...

Tiens. Voilà une obfuscation que je n'avais jamais encore
rencontrée.
N'est-ce pas ? L'opérateur + unaire fait bien partie du langage,

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 '<<', de manière portable.
'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

Avatar
James Kanze
fanny Chevalier writes:

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

Sauf pour certaines valeurs bien précises des unsigned char:-).

Je répète : >> et << sont pour les entrées/sorties
formattées texte. Si tu veux accès aux octets de base, il faut se
servir des fonctions non formattées : get, read, etc. Ou du streambuf
directement.

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