Pergunta

Eu estou em um curso personalizado C ++. Conheço o básico por muitos anos, mas eu estou atualmente tentando refrescar minha memória e aprender mais. Para o efeito, como a minha segunda tarefa (depois de escrever uma classe pilha com base em listas ligadas), estou escrevendo minha própria classe string.

É ido muito bem até agora; Quero operador de sobrecarga >> que eu possa fazer coisas como cin >> my_string ;. O problema é que eu não sei como ler o istream corretamente (ou talvez o problema é que eu não sei correntes ...). Eu tentei um tempo (! Stream.eof ()) loop que .read () s 128 bytes de cada vez, mas como se poderia esperar, ele pára apenas no EOF. Eu quero que ele leia para uma nova linha, como você começa com cin >> a um std :: string.

Meu classe string tem um alloc função (size_t new_size) que (re) aloca memória, e um acréscimo (const char *) função que faz parte, mas eu, obviamente, precisa saber a quantidade de memória para alocar antes que eu possa gravação para o buffer.

Qualquer conselhos sobre como implementar isso? Eu tentei obter o comprimento istream com seekg () e tellg (), sem sucesso (ele retorna -1), e como eu disse looping até EOF (não parar de ler em uma nova linha) lendo um pedaço de cada vez.

Foi útil?

Solução

Para ler os caracteres do fluxo até ao fim de utilização de linha um loop.

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

Se você correr para fora da sala de realocar o buffer com um tamanho maior. Copiar os dados através de e continuar. Não há necessidade de ser extravagante para um projeto de aprendizagem.

Outras dicas

Você pode usar cin :: getline (tampão *, buffer_size); então você terá que verificar para o mal, EOF e falhar bandeiras:

std :: cin.bad (), std :: cin.eof (), std :: cin.fail ()

a menos ruim ou EOF foram definidos, falhar bandeira sendo definida geralmente indica estouro de buffer, por isso você deve realocar o buffer e continuar lendo no novo tampão depois de chamar std :: cin.clear ()

Uma observação: No STL o operador >> de um istream é sobrecarregado para fornecer este tipo de funcionalidade ou (como por * car) são funções globais. Talvez seria mais sensato para fornecer uma sobrecarga personalizada em vez de sobrecarregar o operador na sua classe.

Verifique a resposta de Jerry Coffin a esta pergunta .

O primeiro método que ele usou é muito simples (apenas uma classe auxiliar) e permitem que você escreva sua entrada em um std::vector<std::string> onde cada elemento do vetor representa uma linha da entrada original.

Isso realmente torna as coisas fáceis quando se trata de processar depois!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top