#include <stdio.h>
#include <string>

#pragma warning(disable:4996)

//! @brief PPM(RGB各1byte,カラー,テキスト)を読み込む
//! @param [in] fname
//! @param [out] width 画像幅
//! @param [out] height 画像高さ
//! @param [out] vmax 最大値
//! @param [out] ppimg 確保したメモリのアドレスを格納するポインタのポインタ
//! @retval true 読み込み成功
//! @retval false 読み込み失敗
bool ppmP3_read(
  const char* const fname,
  int *width,
  int *height,
  int *vmax,
  unsigned char** const ppimg
){
  *width = -1;
  *height = -1;
  *vmax = -1;

  FILE* fp;
  fp = fopen(fname, "rb");
  char tmp[2048];

  
  char c;
  while (c = fgetc(fp)) {
    if (isspace(c))
      continue;

    if (c == 'P') { //フォーマットを特定する
      c = fgetc(fp) - '0';
      if (c != 3) {
        fclose(fp);
        return false;
      }
      continue;
    }

    if (c == '#') { //コメントを読み飛ばす
      while (c != '\r' && c != '\n')
        c = fgetc(fp);
      continue;
    }

    //幅取得
    if (*width < 0) {
      int s = 0;
      while (1) {
        if (isdigit(c)) {
          tmp[s++] = c;
          c = fgetc(fp);
        }
        else {
          tmp[s] = '\0';
          *width = atoi(tmp);
          break;
        }
      }
      continue;
    }

    //高さ取得
    if (*height < 0) {
      int s = 0;
      while (1) {
        if (isdigit(c)) {
          tmp[s++] = c;
          c = fgetc(fp);
        }
        else {
          tmp[s] = '\0';
          *height = atoi(tmp);
          break;
        }
      }
      continue;
    }

    //最大値(白)取得
    if (*vmax < 0) {
      int s = 0;
      while (1) {
        if (isdigit(c)) {
          tmp[s++] = c;
          c = fgetc(fp);
        }
        else {
          tmp[s] = '\0';
          *vmax = atoi(tmp);
          break;
        }
      }
      break;
    }
    else {
      break;
    }
  }

  if (*width < 0 || *height < 0 || *vmax < 0) {
    return false;
  }

  //メモリ確保
  size_t memsize = *width* *height * 3;
  *ppimg = new unsigned char[memsize];
  int read = 0;

  char text[100];
  int index = 0;

  //メモリサイズ分まで読み込む
  while (read<memsize) {
    
    int c = fgetc(fp);//一文字取得

    if (c == EOF)//入力できなかったらループから出る
      break;

    //数字ならストックする
    if (isdigit(c)) {
      text[index] = (char)c;
      index++;
    }
    else {
      //数字以外が入力されたら、
      //ストックした数字を数値化
      //ただし数字が何もストックされていないなら
      //なにもしない
      if (index) {
        text[index] = '\0';
        (*ppimg)[read] = atoi(text);
        read++;
        index = 0;
      }
    }

  }
  return read == memsize;
}

 

使用例:

int main()
{
  int width;
  int height;
  int vmax;

  unsigned char* pimg;
  ppmP3_read("C:\\data\\a.ppm", &width, &height, &vmax, &pimg);

}