我被要求编写一个读取BSDF data format defined by Zemax的函数 可以在以下页面找到此类文件的示例:BSDF file example
如果可能,我想使用标准的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
}
感谢任何评论/帮助的人。建设性批评受到欢迎。
费德里科
修改
感谢下面的Joachim Pileborg,我设法继续进行文件的数据块部分。
现在我有以下问题。到达数据块时,我编写了以下代码,但在第二次迭代(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
循环的最后一行的问题。
答案 0 :(得分:1)
读取循环可以简化为:
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
}
}
}
这可能不是最优的,只是写在我头顶的东西,但应该有效。
答案 1 :(得分:0)
根据您提供的格式说明:
任何以#符号开头的行都会被忽略为注释行。
所以你需要做的是以下
Read the file line by line
If the line starts with # ignore it
Otherwise process the line.
您使用的while
是错误的。请改用getLine
函数,并将其第一个字符与#
进行比较。