我被要求编写一个读取泽马克斯定义的BSDF数据格式的函数,这样的文件示例可以在下面的页面中找到:BSDF文件示例
如果可能的话,我只想使用标准的ifstream函数。
我已经在一个专门的类中准备了所有必要的数据采集器。
我现在正在尝试编写从文件中读取数据的函数。
问题:
# (散列)开头,我要做的事情如下
void ReadBSDFFile(myclass &object) { ifstream infile;infile.open(object.BRDFfilename);char c;infile.get (c );while (c == "#") //问题,显然我不能用这种方式进行比较。我应该如何做呢?{ getline(infile,line);infile.get(c);} //此时我想返回一个字符(因为我不想丢失以*c*) infile.seekg(-1,ios_base::cur)结束的非散列字符;//执行所有rest infile.close()};感谢任何愿意评论/帮助的人。欢迎建设性的批评。
费德里科
编辑:
感谢下面的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循环的最后一行的问题。
发布于 2011-11-14 13:42:56
读取循环可以简化如下:
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
}
}
}这可能不是最理想的,只是写在我的头顶上,但应该有效。
发布于 2011-11-14 13:43:57
根据您提供的格式说明:
任何以#符号开头的行都会被忽略为注释行。
所以你需要做的是
Read the file line by line
If the line starts with # ignore it
Otherwise process the line. 您使用的while是错误的。改用getLine函数,并将其第一个字符与#进行比较。
https://stackoverflow.com/questions/8122333
复制相似问题