我想使用C ++将输入文件读入Class对象。
这里是类对象 我试图将文件输入读入数组,但是在“Polygon”关键字后面的行中读取时出现了问题。
class Polygon{
public:
int object_number;
float point_count;
float Px[SIZE][SIZE];
float Py[SIZE][SIZE];
float Pz[SIZE][SIZE];
float Nx[SIZE], Ny[SIZE], Nz[SIZE];
};
我希望能够将Polygon关键字之后的所有信息存储到下一个Polygon关键字。
因此,对于文件中的第一个多边形。
object_number = 0;
point_count = 4;
Px[0][0] = 100;
Py[0][0]= 100;
Pz[0][0] = 200;
Nx[0][0] = 0.398925;
Ny[0][0] =0.598388;
Nz[0][0] = -0.453324;
依此类推,直到它到达文件中的下一个“Poylgon”关键字。我将使用这些信息来执行一些phong着色计算
文件包含。
Polygon 0 4
100 100 200 0.398925 0.598388 -0.453324
125 100 178 0.352837 0.646868 -0.490051
125 125 145 0.396981 0.595472 -0.551363
100 125 167 0.448836 0.550844 -0.510041
Polygon 1 4
100 125 167 0.448836 0.550844 -0.510041
125 125 145 0.396981 0.595472 -0.551363
125 150 118 0.447405 0.521972 -0.621396
100 150 140 0.505846 0.482853 -0.574825
Polygon 0 4
100 150 140 0.505846 0.482853 -0.574825
125 150 118 0.447405 0.521972 -0.621396
125 175 97 0.501037 0.417531 -0.695885
100 175 119 0.566484 0.386239 -0.643732
Polygon 1 4
100 175 119 0.566484 0.386239 -0.643732
125 175 97 0.501037 0.417531 -0.695885
125 200 82 0.501037 0.417531 -0.695885
100 200 104 0.566484 0.386239 -0.643732
.......
答案 0 :(得分:0)
除非你有一个相当具体的理由不这样做(例如需要将所有的点作为单个内存块传递给GPU),否则可能会更容易将其分解为更易于管理的作品。
class point {
float px, py, pz, nx, ny, nz;
// not sure about their order in the file, so you may need to fix this:
friend std::istream &operator>>(std::istream &is, point &p) {
return is >> p.nx >> p.ny >> p.nz >> p.px >> p.py >> p.pz;
}
};
class polygon {
int object_number;
std::vector<point> points;
friend std::istream &operator>>(std::istream &is, polygon &p) {
int point_count;
std::string check;
is >> check;
if (check != "polygon") {
is.setstate(std::ios::failbit);
return is;
}
is >> p.object_number >> point_count;
for (int i=0; i<p.object_number; i++) {
point p2;
is >> p2;
p.points.push_back(p2);
}
return is;
}
};
从那里,我们可以很容易地读取整个多边形文件:
std::ifstream in("mypolygons.txt");
std::vector<polygon> polygons { std::istream_iterator<polygon>(in),
std::istream_iterator<polygon>() };