Вы можете использовать locale , чтобы изменить то, что читается из файла во время его чтения. То есть вы отфильтруете все нечисловые значения:
struct numeric_only: std::ctype<char>
{
numeric_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[':'], std::ctype_base::digit);
return &rc[0];
}
};
std::fstream myFile("foo.txt");
myfile.imbue(std::locale(std::locale(), new numeric_only()));
Затем, когда вы прочитаете ваш файл, он преобразует все не цифры в пробелы, оставляя вам только цифры. После этого вы можете просто использовать обычные преобразования для преобразования читаемого в целые числа.
std::vector<int> intFromFile;
std::istream_iterator<int> myFileIter(myFile);
std::istream_iterator<int> eos;
std::copy(myFileIter, eos, std::back_inserter(intFromFile));
Ответ на комментарии ниже:
Вот что я сделал, чтобы заставить его работать
int main(int args, char** argv){
std::fstream blah;
blah.open("foo.txt", std::fstream::in);
if(!blah.is_open()){
std::cout << "no file";
return 0;
}
blah.imbue(std::locale(std::locale(), new numeric_only()));
std::vector<int> intFromFile;
std::istream_iterator<int> myFileIter(blah);
std::istream_iterator<int> eos;
std::copy(myFileIter, eos, std::back_inserter(intFromFile));
return 0;
}
И это помещает в вектор только целые числа, ни больше, ни меньше. Причина, по которой он не работал раньше, была в два раза:
- Я заполнял до «9», но не до «9». Я изменил заливку на ':'
- Числа, превышающие то, что может хранить int, являются проблемой. Я бы предложил использовать длинные.