Чтение изображения 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();
перед началом чтения циклов.