?
Solved

Need help on reading in Managed Class

Posted on 2004-04-27
9
Medium Priority
?
296 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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 1000 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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

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

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
Excel styles will make formatting consistent and let you apply and change formatting faster. In this tutorial, you'll learn how to use Excel's built-in styles, how to modify styles, and how to create your own. You'll also learn how to use your custo…
Suggested Courses

801 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