【问题标题】:Reading PPM file header (type P6), width is missing读取 PPM 文件头(类型 P6),缺少宽度
【发布时间】:2016-11-10 17:39:36
【问题描述】:

假设您正在读取这样的 PPM 文件:

ifstream img;
img.open("Image.ppm", ios::binary);
try
{
    if (img.fail())
    {
        throw("Can't open input file");
    }
    string header;
    int w, h, b;
    img >> header;
    cout << header << endl;
    if (header.compare("P6") != 0)
    {
        throw("Wrong format file. File needs to be P6 type!");
    }
    img >> w >> h >> b;
    cout << w << " " << h << " " << b << endl;
    if (b < 0 || b > 255)
    {
        throw("An error message"); 
    }
    img.ignore(256, '\n');
}
catch (const char *err) 
{
    fprintf(stderr, "%s\n", err);
    img.close();
}

有人删除了标题中的宽度或高度值。 现在 b 值将以字节形式读取一个 RGB 数字。是否存在 if 语句不会阻止程序结束的情况?换句话说,有没有一种优化的方法来防止此类错误?

【问题讨论】:

  • 读取为一行(使用getline),将字符串放入istringstream 并使用字符串流解析值。应该稍微简化错误处理。
  • 您还必须注意标题中可能包含的 cmets(以 # 开头的行)。
  • 是的,我知道。我会处理的。

标签: c++ ppm


【解决方案1】:

一个可能的问题: 1. b 之后的数据是二进制的,所以你的场景中的 b 可能是非 ASCII 的,因此是 0,这可以通过你的错误消息测试。

【讨论】:

    【解决方案2】:

    在最简单的情况下,如果 R 值恰好是数字 (48-57) 的 ASCII 值,而 G 值恰好是空格 (32) 的 ASCII 值,b 会以数字的值(因此不会通过测试。

    【讨论】:

    • 那么什么是合适的 if 语句来避免该错误?
    • 正如“一些程序员老兄”所说:将一个 \n 读入一个字符串,然后从字符串中解析出值。
    猜你喜欢
    • 2016-02-09
    • 2016-07-11
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2016-05-29
    • 2018-07-08
    • 1970-01-01
    • 2021-12-16
    相关资源
    最近更新 更多