lordiano
asked on
Need help on reading in Managed Class
Hi all, Currently I have this code :
void read_file(char * filename)
{
int width, height, maxColorVal, R, G, B;
unsigned char ch1, ch2, ch3;
char buf[100];
System::Drawing::Color mycolor;
ifstream infile("Dune.ppm", ios_base::in | ios_base::binary);
infile.getline(buf, 100);
if(infile.peek() == '#'){
infile.getline(buf,100);
}
infile>>width;
infile>>height;
infile>>maxColorVal;
Bitmap *mybmp = new Bitmap(width, height);
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
infile>>ch1;
infile>>ch2;
infile>>ch3;
mycolor = System::Drawing::Color::Fr omArgb(ch1 ,ch2,ch3);
mybmp->SetPixel(j, i, mycolor);
R = G = B = 0;
}
}
infile.close();
pictureBox2->Image = dynamic_cast<Image*>(mybmp );
}
========================== ========== ========== ========== ========== =======
It seems that the resulting picture isn't correct, I am not sure why but i am guessing its the EVIL managed class thing thats reading the thing wrong..
I have heard that I should use FileStream , and BufferedStream
But I am not so sure how I can read 1 line from the file? I couldn't find any member function does that trick..
In the ppm file i am reading, i should be reading the first 3~4 lines of HEADER information, then everything after that is
RGBRGBRGBRGB.....etc
How do i read lines using FileStream or BufferedStream? (and how can i do the same job as if i were using infile>>ch)
thanks in advance!
void read_file(char * filename)
{
int width, height, maxColorVal, R, G, B;
unsigned char ch1, ch2, ch3;
char buf[100];
System::Drawing::Color mycolor;
ifstream infile("Dune.ppm", ios_base::in | ios_base::binary);
infile.getline(buf, 100);
if(infile.peek() == '#'){
infile.getline(buf,100);
}
infile>>width;
infile>>height;
infile>>maxColorVal;
Bitmap *mybmp = new Bitmap(width, height);
for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
infile>>ch1;
infile>>ch2;
infile>>ch3;
mycolor = System::Drawing::Color::Fr
mybmp->SetPixel(j, i, mycolor);
R = G = B = 0;
}
}
infile.close();
pictureBox2->Image = dynamic_cast<Image*>(mybmp
}
==========================
It seems that the resulting picture isn't correct, I am not sure why but i am guessing its the EVIL managed class thing thats reading the thing wrong..
I have heard that I should use FileStream , and BufferedStream
But I am not so sure how I can read 1 line from the file? I couldn't find any member function does that trick..
In the ppm file i am reading, i should be reading the first 3~4 lines of HEADER information, then everything after that is
RGBRGBRGBRGB.....etc
How do i read lines using FileStream or BufferedStream? (and how can i do the same job as if i were using infile>>ch)
thanks in advance!
ASKER
the thing is the HeaderFile are not of the same size. Becuaes in ppm standard there can be comment line in the header file..
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
The header file should contain its length somewhere in the first bytes.
You should read this bytes first and then use their contents to calculate and read the whole rest of the header chunk (at once or char by char)
Anyway using getline() is not appropriate.
You should read this bytes first and then use their contents to calculate and read the whole rest of the header chunk (at once or char by char)
Anyway using getline() is not appropriate.
I ment "The header of the file "
sorry
sorry
ASKER
Hi Mafalda, thanks for input.
This is what the header file looks like
P6
#comment line (does not have to be here)
300 300
255
theRGB data goes here
I cannot really get the size of the header..
I think the data i am getting is Off because when the image is displayed, I can tell its of the same shape as the original PPM but the color is distorded for some reason.
So it must be the infile>>ch thing?
I tried using infile.get() and i get even crappier color.
This is what the header file looks like
P6
#comment line (does not have to be here)
300 300
255
theRGB data goes here
I cannot really get the size of the header..
I think the data i am getting is Off because when the image is displayed, I can tell its of the same shape as the original PPM but the color is distorded for some reason.
So it must be the infile>>ch thing?
I tried using infile.get() and i get even crappier color.
You could try and read two chars for P6
Then read until the end of comment which will be an end of line or a '\0' char // this size varies
Then read the other bytes you expect (the 300 300 255) and then the RGB data.
Then read until the end of comment which will be an end of line or a '\0' char // this size varies
Then read the other bytes you expect (the 300 300 255) and then the RGB data.
Use a read and not operator>>
Either FileStream.Read or fstream.read
I still dont understand if you changed the code to Managed C++ using FileStream or if you sticked to fstream
Example (for fstream)
fstream f("my file.ppm", ios_base::in);
char c;
while (!f.eof())
{
f.read(&c, 1); // read one character to c;
// use c
}
Either FileStream.Read or fstream.read
I still dont understand if you changed the code to Managed C++ using FileStream or if you sticked to fstream
Example (for fstream)
fstream f("my file.ppm", ios_base::in);
char c;
while (!f.eof())
{
f.read(&c, 1); // read one character to c;
// use c
}
When you use operator>> it reads for you as many characters as needed for each type.
In example
int i;
short s;
char c;
f >> i; // reads 4 bytes
f >> c; // read one byte
f >> s; // reads 2 bytes
This might cause your problem
In example
int i;
short s;
char c;
f >> i; // reads 4 bytes
f >> c; // read one byte
f >> s; // reads 2 bytes
This might cause your problem
public: int Read(
[
In,
Out
] unsigned char array __gc[],
int offset,
int count
);
Reading lines from a binary files is not rational as there are no lines, its a stream of chars.