c ++ ifstream, detectar si letra o EOLine?
Pregunta
Tengo esta función para leer todas las entradas del archivo. El problema es que cuando leo letras, disparo una nueva línea y siempre busco por 1 y no al final de la línea. ¿Cómo puedo escribir mejor esta función?
int v;
while (!in.eof())
{
while (in >> v)
cout << v << " ";
cout << endl;
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
int a;
a=0;
}
Solución
Si su archivo consta de ints separados por espacios en blanco (incluyendo) líneas nuevas, entonces esto debería ser suficiente.
while( in >> v )
{
// do something with v
}
Después del archivo, si in.fail () es falso y in.eof () es verdadero, llegó al final del archivo sin un error de formato. De lo contrario, se produjo un error al leer un int.
Si recibe una entrada inválida y quiere recuperarse de eso, entonces necesita saber cómo quiere recuperarse. Si desea omitir hasta el final de la línea y comenzar a analizar nuevamente, puede usar algo como esto.
in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
Otros consejos
Primer problema, el código anterior no se detiene al final de la línea.
El operador > > () ignora " Caracteres de espacio en blanco " que incluye el nuevo carácter de línea.
¿Cómo se puede escribir esto mejor?
¡Es difícil saberlo sin saber qué está tratando de hacer con los números y cuál es el formato de entrada del archivo!
Pero si estuviera escribiendo esto, lo escribiría sin usar estas líneas:
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
Al procesar un archivo de texto formateado, es raro ver el uso de seek ().
Asumir:
El archivo contiene solo números.
Desea leer todos los números en un contenedor.
std::vector<int> data;
std::copy( std::istream_iterator<int>(in), // An iterator from current point
std::istream_iterator<int>(), // To end of file.
std::inserter(data) // Destination (insert into data)
);