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;
    }
¿Fue útil?

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)
         );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top