Solved

Need help on reading in Managed Class

Posted on 2004-04-27
9
288 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
Comment Utility
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
Comment Utility
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
Comment Utility
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
 
LVL 6

Expert Comment

by:Mafalda
Comment Utility
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
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 6

Expert Comment

by:Mafalda
Comment Utility
I ment "The header of the file "
sorry
0
 

Author Comment

by:lordiano
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
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.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

762 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

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now