Чтение формата данных BSDF - PullRequest
0 голосов
/ 14 ноября 2011

Мне потребовалось написать функцию, которая считывает формат данных BSDF, определенный Zemax Пример такого файла можно найти на следующей странице: Пример файла BSDF

Я бы хотел использовать, если возможно, только стандартные функции ifstream.

Я уже подготовил все необходимые камеры данных в специальном классе.

Я сейчас пытаюсь написать функцию, которая читает данные из файла.

Проблемы:

  • как исключить строки комментариев? как задокументировано, они начинаются с хеша # Я собирался что-то вроде

    void ReadBSDFFile(myclass &object)
    {
    ifstream infile;
    
    infile.open(object.BRDFfilename);
    
    char c;
    infile.get(c);
    while (c == "#") // Problem, apparently I cannot compare in this way. How should I do it?
    {
       getline(infile, line);
       infile.get(c);
    }
    // at this point I would like to go back one character (because I do not want to lose the non-hash character that ended up in *c*)
    infile.seekg(-1, ios_base::cur);
    
    // Do all the rest
    
    infile.close();
    }
    
  • аналогичным образом, я хотел бы проверить, что позже я нахожусь на правильной строке (например, строка "AngleOfIncidence"). Могу ли я сделать это таким образом?

    string AngleInc;
    
    infile >> AngleInc;
    
    if (AngleInc != "AngleOfIncidence")
    {
       //error
    }
    

Спасибо всем, кто прокомментирует / поможет. Конструктивная критика приветствуется.

Federico

EDIT:

Благодаря Йоахиму Пилеборгу, приведенному ниже, мне удалось перейти к части файла с блоками данных.

Теперь у меня следующая проблема. Достигнув блоков данных, я написал следующий фрагмент кода, но на второй итерации (i = 1) я получаю сообщение об ошибке для строки TIS. Может ли кто-нибудь помочь мне понять, почему это не работает? Спасибо

Примечание: blocks - это число на линии AngleOfIncidence, rows - на линии ScatterAzimuth и columns - на ScatterRadial. Я проверил и проверил, что эта часть функции работает как нужно.

// now reading the data blocks.

for (int i=0; i<blocks; i++)
{
    // TIS line
    getline(infile, line);
    if (line.find("TIS") == string::npos)
    {
        // if not, error message
    }

    // Data block
    for (int j=0; j<rows; j++)
    {
        for (int k=0; k<columns; k++)
        {
            infile >> object.BRDFData[i][j][k];
        }
    }
}

РЕДАКТИРОВАТЬ 2:

решено добавить infile.seekg(+2, ios_base::cur); в качестве последней строки цикла i.

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Цикл чтения можно упростить так:

std::string line;
while (getline(infile, line))
{
    if (line[0] != '#')
    {
        // Not a comment, do something with the line
        if (line.find("AngleOfIncidence") != std::string::npos)
        {
            // On the AngleOfIncidence line, do special things here
        }
    }
}

Это может быть не оптимально, просто что-то написано на моей голове, но должно работать.

0 голосов
/ 14 ноября 2011

Из описания предоставленного вами формата:

Любая строка, начинающаяся с символа #, игнорируется как строка комментария.

Итак, что вам нужно сделать, это следующее

Read the file line by line
If the line starts with # ignore it
Otherwise process the line. 

Использованный вами while неверен. Вместо этого используйте функцию getLine и сравните ее первый символ с #.

...