Вы можете использовать locale к сп ange, что вещи читаются из файла по мере его чтения. То есть, вы отфильтровывать все без числовых значений:
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()));
Затем, когда вы читаете файл, он будет конвертировать все не цифры на пробелы, оставляя вам только номера. После этого вы можете просто использовать свои обычные преобразования, чтобы преобразовать то, что читается в int.
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, является проблемой. Я бы предложил использовать длинный.
Я пробовал; но он, похоже, не работает. – Nawaz
@Nawaz ok, gimme a sec, чтобы запустить мой компилятор и посмотреть, где я совершил ошибку. – wheaties
@wheaties: Кстати, идея действительно хороша, если вы заставляете ее работать. Мне бы очень хотелось, чтобы он работал. :-) – Nawaz