i am trying to read a jpeg image through c++ but is unable to do so ,
presently i tried it with code in c as i use something like ;
FILE * fp=fopen("./x.jpg","wb");
int c;
do{
read(fp,&c,sizeof(c));
if( c==(int) 0xFF23){
do.....
do....
}
printf("%x",c);
}
while(c!=EOF);
but the problem is the if condition never evalutes to true as i know
that according to the jpeg standard there should be market with value
0xFFD8 and others also .....and also the printf() of integer 'c' as
hex is never displayed it just displays a blank ..
what could be wrong ??
or what is the best way to read a binary file such as an image ??
thanks a lot
mohan gupta
This opens the file for writing. If a file with the same name already
exists its content is erased and the file is treated as a new empty
file.
--
Max
> hello everyone ,
>
> i am trying to read a jpeg image through c++ but is unable to do so ,
> presently i tried it with code in c as i use something like ;
>
> FILE * fp=fopen("./x.jpg","wb");
> int c;
> do{
> read(fp,&c,sizeof(c));
error: invalid conversion from ‘FILE*’ to ‘int’
Note that read (which is not portable, by the way) takes a file
*descriptor*, not a FILE pointer.
[...]
> or what is the best way to read a binary file such as an image ??
A more C++-like style might be something like:
#include <fstream>
#include <iostream>
std::ifstream fs("./x.jpg", std::ios::in|std::ios::binary);
if (!fs) {
// failed to open file - do something about it
}
char c;
while (fs >> c) { // evaluates to false if read fails (e.g. past EOF)
// do something with c
}
fs.close();
--
Lionel B
i am really sorry people - i the real code would be like --
FILE * fp=fopen("./x.jpg","rb");
int c;
do{
fread(fp,&c,sizeof(c));
i am trying to read a jpeg image through c++ but is unable to do so ,
presently i tried it with code in c as i use something like ;
FILE * fp=fopen("./x.jpg","rb");
int c;
do{
fread(fp,&c,sizeof(c));
if( c==(int) 0xFF23){
do.....
do....
}
printf("%x",c);
}
while(c!=EOF);
but the problem is the if condition never evalutes to true as i know
that according to the jpeg standard there should be market with value
0xFFD8 and others also .....and also the printf() of integer 'c' as
hex is never displayed it just displays a blank ..
what could be wrong ??
or what is the best way to read a binary file such as an image ??
thanks a lot
mohan gupta
Since he wants to read raw binary input into an int, he can do exactly
that also with C++ streams:
fs.read((char*)&theInt, sizeof(int));
He can check if the reading succeeded with fs.fail().
>i am really sorry people - i the real code would be like --
>
>
>FILE * fp=fopen("./x.jpg","rb");
>int c;
>do{
>fread(fp,&c,sizeof(c));
You should be testing here whether the read failed..
>if( c==(int) 0xFF23){
You have a portability problem.
Does the sequence of octets 0xFF, 0x23 correspond to the int value
0xFF23 or 0x23FF?
What happens to your next read from the file if sizeof(c) isn't 2?
>do.....
>do....
>
>}
>
>printf("%x",c);
>}
>
>while(c!=EOF);
Wrong test. This could (coincidentally) happen at any point in the file,
or not at all.
EOF is what fgetc() etc. return. You're calling fread(), which has a
different way of indicating end of file.
--
Richard Herring
In which system are you running this? If you are running it in a unix
shell, the prompt might be overwriting what that printf() printed
because you are not printing a newline character at the end.
The most probable reason for the if() to fail is that you are probably
reading 4 bytes rather than 2 (I will assume in your system 'int' is
32-bit), and will have something completely different from 0xFF23 even
if the first two bytes in the input file had those values.
The surest (and most portable) way of making that work is that you do
indeed read two bytes explicitly, one byte at a time, and either compare
them directly to those two values, or construct an integer with those
types (with shifting and bit-orring).
One typical technique to read and interpret the header data of a
binary file (such as an image file) is to read the header data into an
array (of unsigned chars), and then reading individual bytes as
necessary from that array. This is the easiest way to quickly get all
the header info from such a file (assuming the header has a fixed format).
What's the advantage of calling read() over extraction here? You can still
check the state of the stream afterwards.
--
Lionel B
> [...]
> #include <fstream>
> #include <iostream>
I don't think this is what you want. That's a formatted
extraction; it's going to skip spaces. Which isn't likely to
work if you're reading binary data.
while ( fs.get( c ) ) {
is probably what you're looking for.
> // do something with c
> }
> fs.close();
--
James Kanze (GABI Software) email:james...@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
> > > or what is the best way to read a binary file such as an image ??
> i am really sorry people - i the real code would be like --
> FILE * fp=fopen("./x.jpg","rb");
> int c;
> do{
> fread(fp,&c,sizeof(c));
Which won't compile either. fread takes 4 arguments (and the
file pointer is the last one).
Also, it's really a worthless function, because it doesn't do
any formatting (or unformatting, as the case may be).
> Since he wants to read raw binary input into an int, he can do
> exactly that also with C++ streams:
> fs.read((char*)&theInt, sizeof(int));
Which doesn't work any better than his proposed solution in C.
The reinterpret_cast should tip you off about that.
> He can check if the reading succeeded with fs.fail().
Or just fs.
> > i am trying to read a jpeg image through c++ but is unable
> > to do so , presently i tried it with code in c as i use
> > something like ;
> > FILE * fp=fopen("./x.jpg","rb");
> > int c;
> > do{
> > fread(fp,&c,sizeof(c));
> > if( c==(int) 0xFF23){
> > do.....
> > do....
> > }
> > printf("%x",c);
>
> > }
> > while(c!=EOF);
> > but the problem is the if condition never evalutes to true as i know
> > that according to the jpeg standard there should be market with value
> > 0xFFD8 and others also .....and also the printf() of integer 'c' as
> > hex is never displayed it just displays a blank ..
> In which system are you running this? If you are running it in
> a unix shell, the prompt might be overwriting what that
> printf() printed because you are not printing a newline
> character at the end.
I rather doubt that he gets that far.
> The most probable reason for the if() to fail is that you are
> probably reading 4 bytes rather than 2 (I will assume in your
> system 'int' is 32-bit), and will have something completely
> different from 0xFF23 even if the first two bytes in the input
> file had those values.
The most probably reason his code even compiles is that he's
working in C, not in C++. It won't compile with any C++
compiler I've ever used.