c++ - 在C++中读取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->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图像时,我错过了最后一个像素。其他一切似乎都工作正常。有任何想法吗?

最佳答案

PPM file format的所有变体在colourMax参数之后均具有一个空格字符:

Each PPM image consists of the following:

...
5. A height, again in ASCII decimal.
6. Whitespace.
7. The maximum color value (Maxval), again in ASCII decimal. Must be less than 65536 and more than zero.
8. A single whitespace character (usually a newline).
...



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

解决方案:在开始阅读循环之前,只添加 cin.ignore();

关于c++ - 在C++中读取PPM图像缺少最后一个像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35462990/

相关文章:

c++ - 在 C++ 中使用引用向上转换

r - 如何在不使用应用或循环的情况下每 n 列矩阵插入一列

c++ - std::cin while循环给出奇怪的结果

c++ - 用换行符结束数组输入?

c++ - cin语句无法编译

c++ - 虚函数和vtable是如何实现的?

c++ - 如何使用 MinGW 编译 SFML?

c++ - 具有非类型参数的成员函数的部分特化

c++ - 如何在C++中从main向函数发送矩阵参数

javascript - 如何在 HTML 中显示 jQuery 和 Javascript 生成的二维数组?