Można użyć locale ch ange, jakie rzeczy są czytane z pliku podczas jego odczytu. Oznacza to, że można odfiltrować wszystkie wartości nienumeryczne:
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()));
Następnie podczas odczytu pliku, będzie to przeliczenia wszystkich cyfr do pomieszczeń, pozostawiając Ci tylko numery. Następnie możesz po prostu użyć zwykłych konwersji, aby przekształcić to, co jest czytane w int.
std::vector<int> intFromFile;
std::istream_iterator<int> myFileIter(myFile);
std::istream_iterator<int> eos;
std::copy(myFileIter, eos, std::back_inserter(intFromFile));
odpowiedź do poniższych uwag:
Oto co zrobiłem, aby zmusić go do pracy
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;
}
I umieścić tylko ints do wektora, nic więcej, nic mniej. Powód, dla którego nie działał wcześniej, był dwojaki:
- Wypełniałem do "9", ale nie "9". Zmieniłem wypełnienie na ":"
- Liczby większe niż to, co int może zawierać, stanowią problem. Proponuję używać długich.
Próbowałem; ale wydaje się, że nie działa. – Nawaz
@Nawaz ok, daj mi sekundę, aby uruchomić mój kompilator i zobaczyć, gdzie popełniłem błąd. – wheaties
@wheaties: Przy okazji, pomysł jest naprawdę dobry, jeśli sprawisz, że zadziała. Chciałbym zobaczyć, jak to działa. :-) – Nawaz