(Latest Revision: Sun Feb 25 22:38:20 PST 2001 ) copyArt.cpp

copyArt.cpp


/*

This is an example program to show the 
student an example of the coding techniques
that might be used to load the contents of
a file into an array, and to copy the 
contents of the array back out to the 
screen.

*/
#include <fstream.h> //includes iostream.h
#include <assert.h>
#include <string>

const int rowMax = 50 ;
const int colMax = 78 ;

typedef char imageType[rowMax][colMax] ;

/* #################### */
/*      loadArt      */
/* #################### */
/*

This is a function that opens a file and copies the contents into
a rectangular array called "image".

*/
void loadArt (imageType image)

{ /* start of function loadArt */

  char trailChr ;
  int  row, col    ;
  string filename = "asciiArt" ;

        /* The next statement declares an input file stream
           variable "artFile", opens the file "asciiArt", and
           binds the open file to the stream variable.  Note the
           use of the c_str() function to cast the C++ string
           into the equivalent C string. */

  ifstream artFile(filename.c_str()) ;

      // Abort if the previous command failed.

  assert(artFile) ;  
  
        /* The outer loop goes from row to row in the array --
           top to bottom. */

  for (row=0; row<rowMax; row++)
  { /* start of outer loop body */

           /* The inner loop goes across the current row from
              column position 0 on the left to the last column
              position on the right. */

           /* Precondition of this inner loop: we are ready to
              read the first char on a new line in the file. */

    for (col=0; col<colMax; col++)
    { /* start of inner loop body */
         
              /* Read the next char on the current line of the
                 file and copy it into the correct position in
                 the array. */

       image[row][col] =  artFile.get() ;
    } /* end of inner loop body */

        /* We just finished reading a line of the file.  Now get
           past the '\n' character at the end of the line, so the
           precondition will be true for the next repetition of
           the inner loop. */

    trailChr = artFile.get() ;

  } /* end of outer loop body */

} /* end of function loadArt */

/* #################### */
/*       writeArt       */
/* #################### */
void writeArt (imageType image)
{ 
  int row, col ;

         /* Print the image as-is */

         /* The outer loop goes from row to row in the array --
            top to bottom. */

  for (row=0; row<rowMax; row++)
  {
           /* The inner loop goes across the current row from
              column position 0 on the left to the last column
              position on the right. */

    for (col=0; col<colMax; col++)
       cout << image[row][col] ;

          /*  Now that we have printed one row, move to
              the beginning of the next line on the screen. */

    cout << endl ;

  }

         /* For fun: print the image upside down. */

  for (row=rowMax-1; row>=0; row--)
  {
    for (col= colMax-1; col>= 0; col--)
    cout << image[row][col] ;
    cout << endl ;
  }

         /* For fun: print the image sideways. */

  for (col=0; col<colMax; col++)
  {
    for (row=0; row<rowMax; row++)

      /* Note that we print an extra space
         after each element of the array,
         trying to improve the "aspect ratiol"
         of the display. */

    cout << image[row][col] << ' ';
    cout << endl ;
  }

}

/* #################### */
/*         MAIN         */
/* #################### */
int main(void)
{ /* main program */

  imageType image ;

  loadArt (image) ;
  writeArt(image) ;

} /* main program */