28 #ifndef GUDHI_OFF_READER_H_
29 #define GUDHI_OFF_READER_H_
53 Off_reader(std::ifstream& stream):stream_(stream){
72 template<
typename OffVisitor>
73 bool read(OffVisitor& off_visitor){
74 bool success_read_off_preambule = read_off_preambule(off_visitor);
75 if(!success_read_off_preambule) {
76 std::cerr <<
"could not read off preambule\n";
80 bool success_read_off_points = read_off_points(off_visitor);
81 if(!success_read_off_points) {
82 std::cerr <<
"could not read off points\n";
86 bool success_read_off_faces = read_off_faces(off_visitor);
87 if(!success_read_off_faces) {
88 std::cerr <<
"could not read off faces\n";
93 return success_read_off_preambule && success_read_off_points && success_read_off_faces;
97 std::ifstream& stream_;
108 template<
typename OffVisitor>
109 bool read_off_preambule(OffVisitor& off_visitor){
111 if(!goto_next_uncomment_line(line))
return false;
113 bool is_off_file = (line.find(
"OFF") != std::string::npos);
114 bool is_noff_file = (line.find(
"nOFF") != std::string::npos);
116 if(!is_off_file && !is_noff_file) {
117 std::cerr << line<<std::endl;
118 std::cerr <<
"missing off header\n";
122 if(!goto_next_uncomment_line(line))
return false;
123 std::istringstream iss(line);
126 if(!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)){
127 std::cerr <<
"incorrect number of vertices/faces/edges\n";
132 if(!(iss >> off_info_.dim >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)){
133 std::cerr <<
"incorrect number of vertices/faces/edges\n";
136 off_visitor.init(off_info_.dim,off_info_.num_vertices,off_info_.num_faces,off_info_.num_edges);
141 bool goto_next_uncomment_line(std::string& uncomment_line){
142 uncomment_line.clear();
144 std::getline(stream_, uncomment_line);
145 while(uncomment_line[0] ==
'%');
146 return (uncomment_line.size()>0 && uncomment_line[0] !=
'%');
150 template<
typename OffVisitor>
151 bool read_off_points(OffVisitor& visitor){
152 int num_vertices_to_read = off_info_.num_vertices;
153 while(num_vertices_to_read--){
155 if(!goto_next_uncomment_line(line))
return false;
156 std::vector<double> point;
157 std::istringstream iss(line);
158 point.assign(std::istream_iterator<double>(iss),std::istream_iterator<double>());
160 visitor.point(point);
165 template<
typename OffVisitor>
166 bool read_off_faces(OffVisitor& visitor){
168 while(goto_next_uncomment_line(line)){
169 std::istringstream iss(line);
170 int num_face_vertices;
171 iss >> num_face_vertices;
172 std::vector<int> face;
173 face.assign(std::istream_iterator<int>(iss),std::istream_iterator<int>());
174 if(!face.size() == off_info_.num_vertices)
return false;
175 visitor.maximal_face(face);
182 template<
typename OFFVisitor>
183 void read_off(
const std::string& name_file_off,OFFVisitor& vis){
184 std::ifstream stream(name_file_off);
185 if(!stream.is_open())
186 std::cerr <<
"could not open file \n";
188 Off_reader off_reader(stream);
189 off_reader.read(vis);
bool read(OffVisitor &off_visitor)
Definition: Off_reader.h:73
Definition: Off_reader.h:51