将文件中的信息存储在Class对象中(C ++)

时间:2015-03-16 23:52:10

标签: c++ file-io

我想使用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


 .......

1 个答案:

答案 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>() };