This is one of the solutions:
struct integer_only: std::ctype<char> { integer_only(): std::ctype<char>(get_table()) {} static std::ctype_base::mask const* get_table() { static std::vector<std::ctype_base::mask> rc(std::ctype<char>::table_size,std::ctype_base::space); std::fill(&rc['0'], &rc['9'+1], std::ctype_base::digit); return &rc[0]; } }; int main() { std::cin.imbue(std::locale(std::locale(), new integer_only())); std::istream_iterator<int> begin(std::cin); std::istream_iterator<int> end; std::vector<int> vints(begin, end); std::copy(vints.begin(), vints.end(), std::ostream_iterator<int>(std::cout, "\n")); return 0; }
Input:
(8,7,15) (0,0,1) (0,3,2) (0,6,3) (1,0,4) (1,1,5)
Conclusion:
8 7 15 0 0 1 0 3 2 0 6 3 1 0 4 1 1 5
Online demo: http://ideone.com/Lwx9y
In the above example, you should replace std::cin file stream after successfully opening the file, since:
std::ifstream file("file.txt"); file.imbue(std::locale(std::locale(), new integer_only())); std::istream_iterator<int> begin(file); std::istream_iterator<int> end; std::vector<int> vints(begin, end);
Here vints is a vector that contains all integers. You want to work with vints to do something useful. Alternatively, you can use it where int* is expected as:
void f(int *integers, size_t count) {} f(&vints[0], vints.size());
A similar trick can be applied when reading only words from a file. Here is an example: