opening jpeg file in c++

M

mohi

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

Maxim Yegorushkin

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

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

Lionel B

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();
 
M

mohi

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

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));
if( c==(int) 0xFF23){
do.....
do....

}

printf("%x",c);
}

while(c!=EOF);
 
J

Juha Nieminen

Lionel said:
char c;
while (fs >> c) { // evaluates to false if read fails (e.g. past EOF)

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().
 
R

Richard Herring

In message
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.
 
L

Lionel B

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

What's the advantage of calling read() over extraction here? You can still
check the state of the stream afterwards.
 
J

James Kanze

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)

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

James Kanze

]
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).
 
J

James Kanze

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top