Мне потребовалось написать функцию, которая считывает формат данных 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
.