source: trunk/src/stl_utility.cc @ 270

Last change on this file since 270 was 270, checked in by Peter, 17 years ago

bug fixes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 2.5 KB
Line 
1// $Id: stl_utility.cc 270 2005-04-13 13:37:14Z peter $
2
3#include "stl_utility.h"
4
5#include <iostream>
6#include <sstream>
7#include <string>
8#include <vector>
9
10namespace theplu {
11namespace cpptools {
12
13  bool is_float(const std::string& s)
14  {
15    // have decimal point
16    bool dp = false; 
17    size_t i = 0;
18    if (s[i] == '-' || s[i] == '+') {
19      i++;
20      // empty after sign
21      if (i >= s.size())
22        return false;                         
23    }
24    bool isf = false;
25    while(i<s.size()){
26      if (s[i] < '0' || s[i] > '9'){
27          if (s[i] == '.') {
28            // two decimals
29            if (dp) 
30              return false;               
31            else
32              dp = true;
33          }
34          else if (s[i] == 'E' || s[i] == 'e'){
35            i++;
36            // nothing following E
37            if (i >=s.size()) 
38              return false;           
39            std::string tmp_str(s,i) ;
40            return is_int(tmp_str);
41          }
42      }
43      else 
44        isf = true;                       
45      i++;
46    }
47    return isf;
48  }
49 
50  bool is_int(const std::string& s)
51  {
52    size_t i = 0;
53    if (s[i] == '-' || s[i] == '+') {             
54      i++;
55      // nothing following sign
56      if (i >= s.size())
57        return false;
58    }
59    while (i<s.size()) {
60      if (s[i] < '0' ||  s[i] > '9')
61        return false;
62      i++;
63    }
64    return true;
65  }
66
67  bool read_to_double(std::istream& is, std::vector<double>& vec)
68  {
69    vec.resize(0);
70    std::vector<std::string> vec_str;
71    if (read_to_string(is,vec_str)){
72      for (size_t i=0; i<vec_str.size(); i++) {
73        if (!is_float(vec_str[i])){
74          std::cerr << "Warning: " << vec_str[i] 
75                    << " is not a number." << std::endl;
76        }
77        vec.push_back(atof(vec_str[i].c_str()));
78      } 
79      return true;
80    }
81    else 
82      return false;
83  }
84
85  bool read_to_int(std::istream& is, std::vector<int>& vec)
86  {
87    vec.resize(0);
88    std::vector<std::string> vec_str;
89    if (read_to_string(is,vec_str)){
90      for (size_t i=0; i<vec_str.size(); i++) {
91        if (!is_int(vec_str[i])){
92          std::cerr << "Warning: " << vec_str[i] 
93                    << " is not an integer." << std::endl;
94        }
95        vec.push_back(atoi(vec_str[i].c_str()));
96      }
97      return true;
98    }
99    else 
100      return false;
101  }
102
103  bool read_to_string(std::istream& is, std::vector<std::string>& vec)
104  {
105    vec.resize(0);
106    std::string s;
107    if (getline(is, s, '\n')){
108      std::istringstream line(s);
109      std::string tmp_string;
110      while (line >> tmp_string) {
111        if(!is.good()) {
112          std::cerr << "error reading data file!" << std::endl;
113          exit(1);
114        }
115        vec.push_back(tmp_string);
116      }
117      return true;
118    }
119    else 
120      return false;
121  }
122
123
124}} // end of namespace cpptools and namespace thep
125
Note: See TracBrowser for help on using the repository browser.