Чтение изображения PPM в C++ без последнего пикселя

Я пытаюсь прочитать изображение PPM из стандартного ввода с этим кодом:

cin >> format;
cin >> ppm->width >> ppm->height >> ppm->colourMax;

for (int r = 0; r < ppm->height; r++) {
  ppm->pixels[r] = new Pixel[ppm->width];
  for (int c = 0; c < ppm->width; c++) {
    Pixel p = Pixel();
    cin.read(reinterpret_cast<char *>(&p.r), sizeof(unsigned char));
    cin.read(reinterpret_cast<char *>(&p.g), sizeof(unsigned char));
    cin.read(reinterpret_cast<char *>(&p.b), sizeof(unsigned char));
    ppm->pixels[r][c] = p;
  }
}

Однако, когда я вывожу изображение PPM без изменений, мне не хватает самого последнего пикселя. Все остальное, кажется, работает отлично. Есть идеи?

1 ответ

Решение

Формат файла PPM имеет для всех его вариантов один пробел после colourMax параметр:

Каждое изображение PPM состоит из следующего:

...
5. Высота, опять же в десятичном виде ASCII.
6. Пробелы.
7. Максимальное значение цвета (Maxval), опять же в десятичном виде ASCII. Должно быть меньше 65536 и больше нуля.
8. Один символ пробела (обычно перевод строки).
...

В вашем коде этот дополнительный пробел не извлекается из потока, потому что read() начинает чтение с текущей позиции. И когда вы читаете фиксированное количество символов, это дополнительное пространство заставляет ваш код игнорировать последний символ.

Решение: просто cin.ignore(); перед началом чтения циклов.

Другие вопросы по тегам