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);
110 if (!is_off_file && !is_noff_file) {
111 std::cerr << line << std::endl;
112 std::cerr <<
"missing off header\n";
118 stream_ >> off_info_.dim;
123 if (!goto_next_uncomment_line(line))
return false;
124 std::istringstream iss(line);
125 if (!(iss >> off_info_.num_vertices >> off_info_.num_faces >> off_info_.num_edges)) {
126 std::cerr <<
"incorrect number of vertices/faces/edges\n";
129 off_visitor.init(off_info_.dim, off_info_.num_vertices, off_info_.num_faces, off_info_.num_edges);
134 bool goto_next_uncomment_line(std::string& uncomment_line) {
137 if (!std::ifstream::sentry(stream_))
return false;
138 std::getline(stream_, uncomment_line);
139 }
while (uncomment_line[0] ==
'#');
140 return static_cast<bool>(stream_);
143 template<
typename OffVisitor>
144 bool read_off_points(OffVisitor& visitor) {
145 int num_vertices_to_read = off_info_.num_vertices;
146 while (num_vertices_to_read--) {
148 if (!goto_next_uncomment_line(line))
return false;
149 std::vector<double> point;
150 std::istringstream iss(line);
151 point.assign(std::istream_iterator<double>(iss), std::istream_iterator<double>());
153 visitor.point(point);
158 template<
typename OffVisitor>
159 bool read_off_faces(OffVisitor& visitor) {
161 while (goto_next_uncomment_line(line)) {
162 std::istringstream iss(line);
163 int num_face_vertices;
164 iss >> num_face_vertices;
165 std::vector<int> face;
166 face.assign(std::istream_iterator<int>(iss), std::istream_iterator<int>());
168 visitor.maximal_face(face);
174 template<
typename OFFVisitor>
175 void read_off(
const std::string& name_file_off, OFFVisitor& vis) {
176 std::ifstream stream(name_file_off);
177 if (!stream.is_open()) {
178 std::cerr <<
"could not open file \n";
181 off_reader.
read(vis);
187 #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