Solved

Need help on reading in Managed Class

Posted on 2004-04-27
9
290 Views
Last Modified: 2013-12-03
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::FromArgb(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!
0
Comment
Question by:lordiano
  • 7
  • 2
9 Comments
 
LVL 6

Expert Comment

by:Mafalda
ID: 10928691
Can't you use Read to read the amount of bytes that makes the header and then use Read or ReadByte to read teh RGB bytes ?

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

Author Comment

by:lordiano
ID: 10928716
the thing is the HeaderFile are not of the same size. Becuaes in ppm standard there can be comment line in the header file..
0
 
LVL 6

Accepted Solution

by:
Mafalda earned 250 total points
ID: 10928764
My previos comment addresed class FileStream.

Your code doesn't work mainly because you try to use getline that is used for text files to read information from binary files.
You can try to use an ifstream using the correct approach which is reading with read() char by char or readsome() for reading the header chunck at one go

Anyway if you are using Managed C++ I suggest that you stick to it otherwise you will be converting all the time back and forth ;o)
0
Are your AD admin tools letting you down?

Managing Active Directory can get complicated.  Often, the native tools for managing AD are just not up to the task.  The largest Active Directory installations in the world have relied on one tool to manage their day-to-day administration tasks: Hyena. Start your trial today.

 
LVL 6

Expert Comment

by:Mafalda
ID: 10928788
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.
0
 
LVL 6

Expert Comment

by:Mafalda
ID: 10928795
I ment "The header of the file "
sorry
0
 

Author Comment

by:lordiano
ID: 10928846
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.


0
 
LVL 6

Expert Comment

by:Mafalda
ID: 10928945
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.
0
 
LVL 6

Expert Comment

by:Mafalda
ID: 10929008
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
}
0
 
LVL 6

Expert Comment

by:Mafalda
ID: 10929041
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
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
C++ Properties One feature missing from standard C++ that you will find in many other Object Oriented Programming languages is something called a Property (http://www.experts-exchange.com/Programming/Languages/CPP/A_3912-Object-Properties-in-C.ht…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

777 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question