Puede utilizar un locale a ch ange qué cosas se leen del archivo a medida que se lee. Es decir, va a filtrar todos los valores no numéricos:
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()));
A continuación, cuando se lee el archivo, se va a convertir todos los dígitos para los no dejando espacios que sólo los números. Después de eso, puedes simplemente usar tus conversiones normales para transformar lo que se está leyendo en ints.
std::vector<int> intFromFile;
std::istream_iterator<int> myFileIter(myFile);
std::istream_iterator<int> eos;
std::copy(myFileIter, eos, std::back_inserter(intFromFile));
respuesta a los siguientes comentarios:
Aquí es lo que hice para conseguir que funcione
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;
}
Y esto pongo sólo los enteros en el vector, nada más y nada Menos. La razón por la que no funcionaba antes era doble:
- Estaba llenando hasta '9' pero no '9' en sí. Cambié el relleno a ':'
- Los números más grandes que lo que puede contener un int son un problema. Sugeriría usar largos.
Lo intenté; pero parece no funcionar – Nawaz
@Nawaz ok, dame un segundo para encender mi compilador y ver dónde cometí un error. – wheaties
@wheaties: Por cierto, la idea es realmente buena si la haces funcionar. Me encantaría verlo funcionar. :-) – Nawaz