2016-11-10 13 views
0

Предполагая, что вы читаете файл PPM, как это:Чтение заголовка файла PPM (тип P6), ширина недостающую

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 не будет препятствовать завершению программы? Другими словами, существует ли оптимизированный метод предотвращения таких ошибок?

+1

Прочитайте как строку (используя 'getline'), поместите строку в' istringstream' и используйте строковый поток для анализа значений. немного. –

+0

Вы также должны позаботиться о возможных комментариях (строка, начинающаяся с '#'), включенная в заголовок тоже. –

+0

Да, я знаю. Позаботьтесь об этом. – Discordgr

ответ

0

Одна из возможных проблем: 1. Данные после b являются двоичными, поэтому b в вашем сценарии может быть не ASCII и, следовательно, быть 0, что может передать ваш тест на сообщение об ошибке.

0

В простейшем случае, если значение R было значением ASCII для цифры (48-57), а значение G было значением ASCII для пробела (32), то b в конечном итоге значение цифры (и, следовательно, не подведет тест.

+0

Итак, что было бы подходящим if-statement, чтобы избежать этого ошибка? – Discordgr

+0

Как «какой-то программист-чувак» сказал: прочитайте до \ n в строку, а затем проанализировать значения из строки. –