0

I'm using files, pgm.c and pgm.h to read in a PGM image file, and then my program will manipulate the file (grayscale, rotation, etc).

However, I can't get the file to read properly. When I use:

   PGMImage* img = (PGMImage*)malloc(sizeof(PGMImage));
   char iName1[256];
   printf("Enter the filename of your PGM image:\n");
   scanf("%s", iName1);
   getPGMfile(iName1, &img);

The console returns the type, width, height and maximum value of the image. However, the width is never correct. It's usually 0 (and one time it was 56, way off) whether I'm using a .pgm file I found online or one I made myself. I've even tried hard-coding the width of the image, but even so, it causes the program the crash. The width should be read in pgm.c, under the getPGMfile function:

void getPGMfile (char filename[], PGMImage *img)
 {
   FILE *in_file;
   char ch;
   int row, col, type;
   int ch_int;

   in_file = fopen(filename, "r");
   if (in_file == NULL)
   {
     fprintf(stderr, "Error: Unable to open file %s\n\n", filename);
     exit(8);
   }

   printf("\nReading image file: %s\n", filename);

   /*determine pgm image type (only type three can be used)*/
   ch = getc(in_file);
   if(ch != 'P')
   {
      printf("ERROR(1): Not valid pgm/ppm file type\n");
      exit(1);
   }
   ch = getc(in_file);
   /*convert the one digit integer currently represented as a character to
     an integer(48 == '0')*/
   type = ch - 48;
   printf("Type: %d", type);
   if((type != 2) && (type != 3) && (type != 5) && (type != 6))
   {
      printf("ERROR(2): Not valid pgm/ppm file type\n");
      exit(1);
   }

   while(getc(in_file) != '\n');             /* skip to end of line*/

   while (getc(in_file) == '#')              /* skip comment lines */
   {
     while (getc(in_file) != '\n');          /* skip to end of comment line */
   }

   /*there seems to be a difference between color and b/w.  This line is needed
     by b/w but doesn't effect color reading...*/
   fseek(in_file, -1, SEEK_CUR);             /* backup one character*/

   fscanf(in_file,"%d", &((*img).width));
   fscanf(in_file,"%d", &((*img).height));
   fscanf(in_file,"%d", &((*img).maxVal));

   //I omitted the rest, but it can be seen in the link above

I have no idea what's causing these errors. I'm using Eclipse and MinGW GCC on Windows 7 (64-bit). My instructor couldn't help me solve this, so I'm hoping you can! :)

To summarize: The width of the PGM image is always read incorrectly, anything done with the file afterwards causes the executable to stop working. Hard-coding the width also causes the the executable to stop working.

James
  • 1
  • 1

2 Answers2

2

getpgm shouldn't be passed the address of your pointer, but rather just the pointer according to the header file: getPGMfile(iName1, img)

KrisSodroski
  • 2,796
  • 3
  • 24
  • 39
  • Thanks! That helps. Any idea why the width won't be read correctly? – James Jul 24 '13 at 20:42
  • Code: `code`printf("\n width = %d",(*img).width); `code`printf("\n height = %d",(*img).height); `code`printf("\n maxVal = %d",(*img).maxVal); `code`printf("\n"); Console: Reading image file: C:\\balloons.pgm Type: 2 width = 0 height = 480 maxVal = 255 – James Jul 24 '13 at 21:10
0

The PGM format goes as

P5
wid ht
xxx xxx xxx xxx

where xxx are the raster values. You need to get rid of each getc function before reading the width, or perform an ungetc when it fails to find the character you are looking for. Then, the width will be read appropriately.

unxnut
  • 8,509
  • 3
  • 27
  • 41