C++ 在C+中读取PPM图像+;缺少最后一个像素

C++ 在C+中读取PPM图像+;缺少最后一个像素,c++,matrix,cin,ppm,C++,Matrix,Cin,Ppm,我正在尝试使用以下代码从标准输入读取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-&

我正在尝试使用以下代码从标准输入读取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;
  }
}
cin>>格式;
cin>>ppm->宽度>>ppm->高度>>ppm->colorMax;
对于(int r=0;rheight;r++){
ppm->像素[r]=新像素[ppm->宽度];
对于(int c=0;cwidth;c++){
像素p=像素();
cin.read(重新解释和p.r),sizeof(无符号字符);
cin.read(重新解释投影(&p.g),sizeof(无符号字符));
cin.read(重新解释铸件(&p.b))、sizeof(无符号字符));
ppm->像素[r][c]=p;
}
}
然而,当我输出PPM图像不变时,我丢失了最后一个像素。其他一切似乎都很完美。有什么想法吗?

colorMax
参数后面有一个空格字符:

每个PPM图像包括以下内容:


5.高度,同样以ASCII十进制表示。
6.空白。
7.最大颜色值(Maxval),同样以ASCII十进制表示。必须小于65536且大于零。
8。单个空白字符(通常为换行)。

在代码中,由于
read()
在当前位置开始读取,因此不会从流中提取额外的空白。当您读取固定数量的字符时,这个额外的空间会导致代码忽略最后一个字符


解决方案:在开始阅读循环之前

尚未检查,但可能缺少第一个像素?缺少哪些像素坐标?这是否取决于输入图像的大小?您尝试过多个源图像文件吗?当我将原始文件与输出进行比较时,原始文件的末尾有一个额外字节。另外值得注意的是,您可以声明
Pixel&p=ppm->pixels[r][c]
,并避免创建无用的中间变量。一个字节对于一个像素是不够的,因为你的代码每像素读取3个字节。那个额外的字节是什么?你们的系统是什么?