Ir para conteúdo
Fórum Script Brasil
  • 0

dúvida fflush C/C++


luccazx

Pergunta

Olá amigos, sou novo no fórum e tenho uma dúvida sobre o fflush(stdin) que adquiri pesquisando. Encontrei alguns tópicos falando que o comando fflush não é uma prática recomendavel pois no futuro acarreta em erros. Os exemplos que encontrei na internet estavam na linguagem C e gostaria de saber se em C++ temos o mesmo problema. Gostaria de saber se o problema que estão falando é o de compatibilidade que pode existir usando o fflush(stdin) em máquinas LINUX por exemplo ...

 

Um exemplo do que estou falando:

Por que não devemos usar fflush(stdin) se ele "funciona" direito??
Na documentação da função está escrito: "effect undefined for input streams".
Se nem eles (que escreveram a função) sabem o que acontece, nós, simples mortais ^_^, muito menos!    

Editado por luccazx
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Olá!

 

Olha sou iniciante em C e uso o sistema Linux ( Ubuntu 14.04 LTS ), bom ao que parece em um primeiro momento a função fflush ( stdin ); parece funcionar na limpeza de buffer do teclado, tanto em sistemas Windows quanto em sistema Linux, porem . . .

 

Eu já havia ouvido falar desta característica da função quando desenvolvia pequenos algorítimos e usava a função para a limpeza do buffer, foi só quando um dos algoritmos que desenvolvi apresentou problemas é que tive de parar de usar a função.

 

Ao que parece a complexidade do algoritmo é um dos principais motivos para a falha da função, deixando claro que podem existir outras variáveis que podem estar causando o problema como incompatibilidade com outras funções do programa, alguma caracteristica especifica de um compilador ao mesmo da Linguagem C.

 

A função aparenta funcionar tanto no Windows quanto no Linux, porem o problema acontece em ambos por isso deve-se evitar tanto quanto possível a utilização da função para a limpeza de buffer do teclado.

 

No Linux uso a função __fpurge ( stdin ); ate agora nunca tive problemas com ela, para o Windows não conheço uma função especifica para o sistema, mas . . .

 

Tanto no Linux quanto no Windows existem pequenos truques que podem ser tentados, apenas não me lembro em quais sistemas e compiladores estes truques funcionaram comigo, mas garanto que funcionam:

 

- ao utilizar a função scanf() colocar um pequeno espaço entre o abre aspas e o simbolo de porcentagem, pode ajudar na limpeza de buffer

 

- outra coisa que se pode tentar é usar a função getchar(); após cada entrada do teclado

 

- outra seria colocando o código de formatação %*c dentro do scanf ( “%*c%s” ), apenas não me lembro se o código é colocado na frente ou atrás do outro

 

não sei nada de C++ então não posso dizer muito sobre a limpeza na linguagem . . .

 

Bom por hora é só . . .

 

Ubuntu 14.04  LTS   -   MonoDevelop 4.0.12

 

Espero ter Ajudado ! ! !

Link para o comentário
Compartilhar em outros sites

  • 0

fflush não foi concebido para trabalhar com o buffer de entrada(stdin), utilizarr fflush conjuntamente com strings é um erro ainda pior, ele foi criado para trabalhar com caracteres somente e com a saída(stdout), o fato que funcione é pura sorte, porem os seus mesmos criadores já advertiram que é uma "loteria" utiliza-lo conjuntamente nos dois casos citados anteriormente, sinceramente eu acho que é uma gambiarra.

Todo programador deveria manter a distancia, desde o inicio de certos hábitos que de usar muito tempo podem causar uma forma de programar errônea, é como aprender musica com posturas erradas ou criando más costumes, depois fica difícil se desprender desses maus hábitos.


O função membro sync da classe cin permite "sincronizar" o buffer de entrada com o que você escreveu no teclado, eliminando esses caracteres incômodos como o \n que faz o programa saltar leituras, essa função faz parte do padrão, a dia de hoje não conheço nada melhor em C++. Claro que não é a única forma, pois existem outras soluções para isso... a única forma que existe para eliminar algo do buffer de entrada é fazendo a leitura tal como mencionou Felipe222 com o getchar, para você fazer uma idéia, essa função que vou postar a continuação é milagrosa, pode servir muito melhor que fflush, e é 100% portável:
 

void flush() {
    int ch;
    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}
}

 


 

Link para o comentário
Compartilhar em outros sites

  • 0
14 horas atrás, Felipe222 disse:

Olá!

 

Olha sou iniciante em C e uso o sistema Linux ( Ubuntu 14.04 LTS ), bom ao que parece em um primeiro momento a função fflush ( stdin ); parece funcionar na limpeza de buffer do teclado, tanto em sistemas Windows quanto em sistema Linux, porem . . .

 

Eu já havia ouvido falar desta característica da função quando desenvolvia pequenos algorítimos e usava a função para a limpeza do buffer, foi só quando um dos algoritmos que desenvolvi apresentou problemas é que tive de parar de usar a função.

 

Ao que parece a complexidade do algoritmo é um dos principais motivos para a falha da função, deixando claro que podem existir outras variáveis que podem estar causando o problema como incompatibilidade com outras funções do programa, alguma caracteristica especifica de um compilador ao mesmo da Linguagem C.

 

A função aparenta funcionar tanto no Windows quanto no Linux, porem o problema acontece em ambos por isso deve-se evitar tanto quanto possível a utilização da função para a limpeza de buffer do teclado.

 

No Linux uso a função __fpurge ( stdin ); ate agora nunca tive problemas com ela, para o Windows não conheço uma função especifica para o sistema, mas . . .

 

Tanto no Linux quanto no Windows existem pequenos truques que podem ser tentados, apenas não me lembro em quais sistemas e compiladores estes truques funcionaram comigo, mas garanto que funcionam:

 

- ao utilizar a função scanf() colocar um pequeno espaço entre o abre aspas e o simbolo de porcentagem, pode ajudar na limpeza de buffer

 

- outra coisa que se pode tentar é usar a função getchar(); após cada entrada do teclado

 

- outra seria colocando o código de formatação %*c dentro do scanf ( “%*c%s” ), apenas não me lembro se o código é colocado na frente ou atrás do outro

 

não sei nada de C++ então não posso dizer muito sobre a limpeza na linguagem . . .

 

Bom por hora é só . . .

 

Ubuntu 14.04  LTS   -   MonoDevelop 4.0.12

 

Espero ter Ajudado ! ! !

15 horas atrás, vangodp disse:

cin.sync(); depois de ler strings e chars

 

cin>>palavra;
cin.sync();
 

9 horas atrás, vangodp disse:

fflush não foi concebido para trabalhar com o buffer de entrada(stdin), utilizarr fflush conjuntamente com strings é um erro ainda pior, ele foi criado para trabalhar com caracteres somente e com a saída(stdout), o fato que funcione é pura sorte, porem os seus mesmos criadores já advertiram que é uma "loteria" utiliza-lo conjuntamente nos dois casos citados anteriormente, sinceramente eu acho que é uma gambiarra.

Todo programador deveria manter a distancia, desde o inicio de certos hábitos que de usar muito tempo podem causar uma forma de programar errônea, é como aprender musica com posturas erradas ou criando más costumes, depois fica difícil se desprender desses maus hábitos.


O função membro sync da classe cin permite "sincronizar" o buffer de entrada com o que você escreveu no teclado, eliminando esses caracteres incômodos como o \n que faz o programa saltar leituras, essa função faz parte do padrão, a dia de hoje não conheço nada melhor em C++. Claro que não é a única forma, pois existem outras soluções para isso... a única forma que existe para eliminar algo do buffer de entrada é fazendo a leitura tal como mencionou Felipe222 com o getchar, para você fazer uma idéia, essa função que vou postar a continuação é milagrosa, pode servir muito melhor que fflush, e é 100% portável:
 


void flush() {
    int ch;
    while ( ( ch = fgetc ( stdin ) ) != EOF && ch != '\n' ) {}
}

 


 

 

Muito obrigado amigos pelos post's. O conteúdo que vocês postaram será de grande valia. Semana passada tive minha primeira aula de vetores na faculdade, para entender melhor fui pesquisar o conteúdo apresentado em sala para saber mais sobre vetores. E em pouco tempo descubro que o uso de fflush(stdin) é uma prática ruim, não sei se minha professora irá mostrar as falhas desse comando, no entanto é bom saber boas práticas para não criar vícios que me comprometam no futuro. 

 

Link para o comentário
Compartilhar em outros sites

  • 0

vetores são um conjunto de variáveis alojadas em memória de forma consecutiva, ou seja, uma detrás de outra, e todas do mesmo tipo, na qual a primeira variável desse grupo é apontada por um ponteiro. você entenderá melhor quando chegue ao tema de ponteiros e aritmética de ponteiros.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...