45 Off_reader(std::ifstream& stream) : stream_(stream) { }
64 template<
typename OffVisitor>
65 bool read(OffVisitor& off_visitor) {
66 bool success_read_off_preambule = read_off_preambule(off_visitor);
67 if (!success_read_off_preambule) {
68 std::cerr <<
"could not read off preambule\n";
72 bool success_read_off_points = read_off_points(off_visitor);
73 if (!success_read_off_points) {
74 std::cerr <<
"could not read off points\n";
78 bool success_read_off_faces = read_off_faces(off_visitor);
79 if (!success_read_off_faces) {
80 std::cerr <<
"could not read off faces\n";
85 return success_read_off_preambule && success_read_off_points && success_read_off_faces;
89 std::ifstream& stream_;
100 template<
typename OffVisitor>
101 bool read_off_preambule(OffVisitor& off_visitor) {
103 if (!goto_next_uncomment_line(line))
return false;
105 bool is_off_file = (line.find(
"OFF") != std::string::npos);
106 bool is_noff_file = (line.find(
"nOFF") != std::string::npos);
108 if (!is_off_file && !is_noff_file) {
109 std::cerr << line << std::endl;
110 std::cerr <<
"missing off header\n";
114 if (!goto_next_uncomment_line(line))
return false;
115 std::istringstream iss(line);
116 if ((is_off_file) && (!is_noff_file)) {
118 if (!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)) {
119 std::cerr <<
"incorrect number of vertices/faces/edges\n";
123 if (!(iss >> off_info_.dim >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)) {
124 std::cerr <<
"incorrect number of vertices/faces/edges\n";
128 off_visitor.init(off_info_.dim, off_info_.num_vertices, off_info_.num_faces, off_info_.num_edges);
133 bool goto_next_uncomment_line(std::string& uncomment_line) {
134 uncomment_line.clear();
136 std::getline(stream_, uncomment_line);
while (uncomment_line[0] ==
'%');
137 return (uncomment_line.size() > 0 && uncomment_line[0] !=
'%');
140 template<
typename OffVisitor>
141 bool read_off_points(OffVisitor& visitor) {
142 int num_vertices_to_read = off_info_.num_vertices;
143 while (num_vertices_to_read--) {
145 if (!goto_next_uncomment_line(line))
return false;
146 std::vector<double> point;
147 std::istringstream iss(line);
148 point.assign(std::istream_iterator<double>(iss), std::istream_iterator<double>());
150 visitor.point(point);
155 template<
typename OffVisitor>
156 bool read_off_faces(OffVisitor& visitor) {
158 while (goto_next_uncomment_line(line)) {
159 std::istringstream iss(line);
160 int num_face_vertices;
161 iss >> num_face_vertices;
162 std::vector<int> face;
163 face.assign(std::istream_iterator<int>(iss), std::istream_iterator<int>());
165 visitor.maximal_face(face);
171 template<
typename OFFVisitor>
172 void read_off(
const std::string& name_file_off, OFFVisitor& vis) {
173 std::ifstream stream(name_file_off);
174 if (!stream.is_open()) {
175 std::cerr <<
"could not open file \n";
178 off_reader.
read(vis);
184 #endif // OFF_READER_H_ bool read(OffVisitor &off_visitor)
Read an OFF file and calls the following methods :
Definition: Off_reader.h:65
Definition: SimplicialComplexForAlpha.h:26
OFF file reader top class visitor.
Definition: Off_reader.h:43