读取BSDF数据格式

时间:2011-11-14 13:33:17

标签: c++ ifstream

我被要求编写一个读取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循环的最后一行的问题。

2 个答案:

答案 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函数,并将其第一个字符与#进行比较。