我正尝试使用以下代码从标准输入读取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图像不变时,我错过了最后一个像素。其他一切似乎都很完美。有什么想法吗?
答案 0 :(得分:1)
PPM file format所有变体的colourMax
参数后面都有一个空格字符:
每个PPM图像由以下内容组成:
...
5.高度,再次以ASCII十进制表示 6.空白。
7.最大颜色值(Maxval),再次以ASCII十进制表示。必须小于65536且大于零 的 8。单个空白字符(通常是换行符)。
...
在您的代码中,这个额外的空格不是从流中提取的,因为read()
开始在当前位置读取。当您读取固定数量的字符时,此额外空间会导致您的代码忽略最后一个字符。
解决方案:在开始阅读循环之前只需cin.ignore();
。