c ++ ifstream, detectar se letra ou EOLine?
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;
}
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)
);