Pergunta

Eu tenho essa função para ler em todos inteiros do arquivo. O problema é quando eu lia as cartas i desencadear uma nova linha e eu sempre procurar por um e não ao fim da linha. Como posso escrever essa função melhor?

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

Solução

Se o arquivo é composto por apenas ints separados por espaços em branco (incluindo) novas linhas, então isso deve ser suficiente.

while( in >> v )
{
    // do something with v
}

Depois que o arquivo, se in.fail () é falsa e in.eof () é verdadeiro, então você chegou ao final do arquivo sem um erro de formatação. Caso contrário, um erro ao ler um int ocorreu.

Se você receber uma entrada inválida e quer recuperar a partir de então você precisa trabalhar para fora como você deseja recuperar. Se você quiser pular até o final da linha e começar a analisar novamente, você pode usar algo como isto.

in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

Outras dicas

O primeiro problema o código acima não pára no final da linha.
O operador >> () ignora " Espaço Branco Personagens ", que inclui o caractere de nova linha.

Como isso pode ser escrito melhor?
Isso é difícil dizer sem saber o que você está tentando fazer com os números e que o formato de entrada do arquivo é!

Mas se eu fosse escrita isto gostaria de escrevê-la sem usar estas linhas:

    if (in.eof())
            break;
    in.clear();
    in.seekg(1, ios::cur);

Quando o processamento de um arquivo de texto formatado é raro ver o uso de seek ().

Assumign:
Arquivo contém números apenas.
Você quer ler todos os números em um recipiente.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top