Solved

Need help on reading in Managed Class

Posted on 2004-04-27
9
292 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 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
Industry Leaders: 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: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying 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

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

733 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