请教各位朋友,我这里的程序想改写,就是把main函数中的东西通过class方法实现,我费劲想了很久,没有好的思路,请教各位帮助,感谢!
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
/*** New Data Types ***/
typedef unsigned char BYTE;
int main(int argc, char* argv[])
/**************************************************************************************************
Arguments:
argv[1]: input file name
argv[2]: output file name
**************************************************************************************************/
{
ifstream infile; /* input file */
ofstream outfile_R;
ofstream outfile_G; /* output files */
ofstream outfile_B;
char inFileName[128]; /* input file name */
char outFileName_R[128];
char outFileName_G[128]; /* output file name */
char outFileName_B[128];
int width; /* width of input source */
int height; /* height of input source */
int Npixels, maxValue, i;
BYTE *pRGB;
BYTE *pR, *pG, *pB;
char buf[16];
int bufIndex;
// read the arguments
if(argc == 5)
{
strcpy(inFileName, argv[1]);
strcpy(outFileName_R, argv[2]);
strcpy(outFileName_G, argv[3]);
strcpy(outFileName_B, argv[4]);
}
else
{
cout<<"PPM(p6) converts to PGM(p5)\n";
cout<<"input Filename: ";
cin>>inFileName;
cout<<"Output Filename_R: ";
cin>>outFileName_R;
cout<<"Output Filename_G: ";
cin>>outFileName_G;
cout<<"Output Filename_B: ";
cin>>outFileName_B;
}
/* open input/output file */
infile.open(inFileName, ios::binary);
outfile_R.open(outFileName_R, ios::binary);
outfile_G.open(outFileName_G, ios::binary);
outfile_B.open(outFileName_B, ios::binary);
/* check input file */
if(!infile)
{
cout<<"Cannot open input file "<< inFileName<<endl;
return 1;
}
infile.read(buf, 2); // get the magic number
buf[2]='\0';
if(buf[0] == 'P' && buf[1] == '6'){
infile.read(buf, 1);
while(isspace(buf[0])){ // Skip white space(s)
infile.read(buf,1);
}
if(buf[0] == '#') { // Skip the comment line
while(buf[0] != '\n'){ // search end of line
infile.read(buf,1);
}
while(isspace(buf[0])){ // Skip white space(s)
infile.read(buf,1);
}
}
// get width
bufIndex = 0;
while(bufIndex < 15 && !isspace(buf[bufIndex])){
bufIndex++;
infile.read(buf+bufIndex, 1);
}
buf[bufIndex] = NULL; // null terminated string
width = atoi(buf);
// get height
infile.read(buf,1);
while(isspace(buf[0])){ // Skip white space(s)
infile.read(buf,1);
}
bufIndex = 0;
while(bufIndex < 15 && !isspace(buf[bufIndex])){
bufIndex++;
infile.read(buf+bufIndex, 1);
}
buf[bufIndex] = NULL; // null terminated string
height = atoi(buf);
// get max value
infile.read(buf,1);
while(isspace(buf[0])){ // Skip white space(s)
infile.read(buf,1);
}
bufIndex = 0;
while(bufIndex < 15 && !isspace(buf[bufIndex])){
bufIndex++;
infile.read(buf+bufIndex, 1);
}
buf[bufIndex] = NULL; // null terminated string
maxValue = atoi(buf);
if (maxValue == 255) { // 255 is the only type this program reads
Npixels = width * height;
pRGB = new BYTE [3*Npixels];
pR = new BYTE [Npixels];
pG = new BYTE [Npixels];
pB = new BYTE [Npixels];
infile.read(reinterpret_cast<char *>(pRGB), 3*Npixels);
outfile_R << "P5" << endl;
outfile_R << width << " " << height << endl;
outfile_R << maxValue << endl;
outfile_G << "P5" << endl;
outfile_G << width << " " << height << endl;
outfile_G << maxValue << endl;
outfile_B << "P5" << endl;
outfile_B << width << " " << height << endl;
outfile_B << maxValue << endl;
for (i=0; i < Npixels; i++){
pR[i] = pRGB[i*3];
pG[i] = pRGB[i*3+1];
pB[i] = pRGB[i*3+2];
}
outfile_R.write(reinterpret_cast<char *>(pR), Npixels);
outfile_G.write(reinterpret_cast<char *>(pG), Npixels);
outfile_B.write(reinterpret_cast<char *>(pB), Npixels);
}
else {
cout << "Error: wrong MaxGray value -- 255 \n";
width = height = 0;
}
}
else {
cout << "Error: wrong MagicValue -- P6 \n";
width = height = 0;
}
/* Delete the pointers */
delete [] pRGB;
delete [] pR;
delete [] pG;
delete [] pB;
/* Close file */
outfile_R.close();
outfile_G.close();
outfile_B.close();
infile.close();
return 0;
}