Obra: Programar em C++/Entrada e saída de dados
Matéria: Português
entrada saída aqui vamos dar início ao estudo de recursos que possibilitarão inserir dados fazer reporte da falta deles no entrada saída podem ser feitas através da biblioteca iostream para podermos usá la deveremos colocar linha de código include estrutura de comunicação com meio externo em modo texto composta por um conjunto de objetos estas em conjunto com operadores funções de formatação possibilitam uma forma de comunicação mais intuitiva devido abstração de elementos do mundo real por recursos da orientação objetos forma de entender código torna se mais natural na biblioteca iostream temos os seguintes objetos cin este objeto fornece entrada de dados bufferizada através do standard input device dispositivo de entrada padrão cout este objeto fornece saída de dados bufferizada através do standard output device dispositivo de saída padrão cerr este objeto fornece saída de dados não bufferizada para standard error device dispositivo de erro padrão que inicialmente definido para tela clog este objeto fornece saída bufferizada através do standard error device dispositivo de erro padrão que inicialmente definido para tela foco de orientação objetos que biblioteca iostream confere aos dispositivos de entrada saída uma das características da linguagem ele está presente na maneira na qual código foi idealizado está formatado modificando maneira como as partes do sistema de entrada saída interagem desta forma as operações de interação entre usuário software tornam se mais intuitivas para programador sistema de entrada saída um exemplo deste modelo de programação onde cada entidade física ou lógica de entrada saída representada por objetos cujas operações podem ser acessadas diretamente nos programas buffer para entendermos um pouco mais sobre buffer se faz necessário recordar um pouco sobre funcionamento da memória suas operações relacionadas buffer bufferização um meio de sincronização entre dispositivos de velocidades diferentes tais quais memória dispositivos de armazenamento mecânicos como discos magnéticos para evitar que as operações do dispositivo mais lento interfiram no desempenho do programa pode se fazer com que os dados sejam colocados em uma memória mais rápida depois sejam enviadas ao dispositivo mais lento medida que ele tenha disponibilidade para recebê los desta forma temos os seguintes modos de escrita em dispositivos de saída unbuffered significa que qualquer mensagem ou dados serão escritos imediatamente caso da escrita no dispositivo cerr buffered significa que os dados serão mantidos num buffer de memória até que dispositivo de destino solicite ou que um comando de descarregamento seja executado ou quando buffer estiver cheio problema que se programa interrompido antes do buffer ser escrito esses dados são perdidos cout cout cout out usado em conjugação com operador de inserção sintaxe mais comum da instrução para obter dados do cin cin variable name aqui temos operador de extração que diz que tudo que teclado escrever coloque es
n cin variable name aqui temos operador de extração que diz que tudo que teclado escrever coloque esses dados na variável que me segue este operador consegue até traduzir conceito de dados de fora para dentro include using namespace std int main void int testscore cin testscore cout há mais um pormenor computador está espera de um return enter ou new line ou espaço em branco para finalizar entrada de dados na variável até lá cursor aparece piscar bem na verdade este ponto muito importante por que vejamos mais baixo questão de termos entradas pergunta declaramos uma variável int testscore se colocarmos um valor que não seja um int isto não mesma situação do capítulo anterior porque antes programa ainda não tinha compilado agora temos entrada de dados quando programa já está compilado correr rodar assim se no exemplo anterior colocarmos nome jeff que uma string programa está espera de um int que acontece que cin não vai colocar jeff na variável ele ignora entrada quando cout chamado ele vai colocar valor que está na variável então porque que me apareceu número quando corri rodei programa que na memória física do computador existem dados da área onde variável está alocada fisicamente quando declarei testscore compilador apenas reserva aquela memória mas não apaga que lá está pergunta que que acontece quando inserimos um número maior do que limite do tipo quando programa executar caso de overflow estouro de memória mas quando programa corre roda aqui já não temos questão de dar volta ao intervalo permitido aqui temos caso em que vai ser colocado um número estranho isto não está perfeitamente explicado chama se prompt quando dito ao utilizador que deve fazer que não deixar como no exemplo anterior cursor piscar sem utilizador saber que fazer além de que temos problema de overflow em execução portanto bom que utilizador cumpra os requerimentos de uma maneira muito conveniente os dados recebidos pelo cin são tratados de forma tornar processo polimórfico da mesma forma que no caso de cout assim temos como receber os dados da maneira que precisamos ou seja quando declaramos uma variável int usamos para receber um dado do cin mesmo convertido na entrada para inteiro quando usamos uma variável de outro tipo entrada convertida para tipo da variável lendo um caractere ler um caractere até simples basta utilizar objeto cin será guardado valor digitado na variável char nivel cout nivel porém teremos de pressionar tecla enter depois de digitar caractere isto leva várias questões problema pressione uma tecla para continuar include using namespace std int main void char ch do cout ch if ch ch cout programa funciona bem se pressionarmos ou para sairmos programa funciona bem se pressionarmos qualquer outra tecla com caractere imprimível mas se pressionarmos tecla enter nada acontece cin continua espera de entrada razão operador de extração ignora os espaços em branco os caracteres nova linha resultantes do pressionamento da tecla enter função cin get já tivemos opor
os caracteres nova linha resultantes do pressionamento da tecla enter função cin get já tivemos oportunidade para discutir função getline função membro do objeto cin cin getline name aqui vamos utilizar uma outra função cin get esta função pode ser chamada tal como getline através de argumentos onde primeiro array de caracteres mas também pode ser sem argumentos ou ainda apenas um argumento no caso de não conter argumentos apenas irá ler um caractere em vez de uma cadeia de caracteres no caso de ter um argumento ela aceita qualquer tecla incluindo enter que não se passa com cin operador de extração aqui um exemplo include using namespace std int main void char ch do cout porém se pressionarmos uma tecla de caractere imprimível não conseguiremos inserir próximo prompt parece que houve um salto estranho para explicar razão deste novo problema necessitamos de explicar conceito de buffer input buffer uma área de memória que guarda os caracteres de entrada por exemplo do telado até que essa entrada seja atribuída pelo cin operador de extração ou por funções como get ou getline do objeto cin quando loop começa input buffer está vazio se digitarmos apenas enter sendo este primeiro único caractere no imput buffer ele removido do input buffer atribuído variável ch então input buffer está vazio na próxima iteração do loop se digitarmos enter temos caracteres função get retira primeiro caractere do input buffer atribui variável ch mas nisto caractere nova linha permanece no input buffer isto faz com que na próxima iteração do loop não haja oportunidade para entrar com dados ou seja na segunda iteração retirado caractere nova linha que ficou da iteração colocado na variável ch agora input buffer está vazio cin ignore uma solução limpar caractere nova linha do input buffer antes da chamada da função getline fazemos isso usando função ignore do objeto cin esta função membro tal com get getline são sobrecarregadas podem ser chamadas sem argumentos com um ou dois argumentos utilizar função ignore sem argumentos permite que próximo caractere no input buffer seja lido depois descartado isto exatamente aquilo que queríamos função com ou argumentos usada para cadeias de caracteres com um argumento argumento número máximo de caracteres ser removido do input buffer exemplo cin ignore remove até caracteres do input buffer com dois argumentos segundo argumento delimitador um caractere que se encontrado antes do número de caracteres especificado no primeiro paramento faz com que remoção pare exemplo cin ignore remove caracteres se até lá não encontrar nova linha reescrevendo código anterior utilizando cin ignore include using namespace std int main void char ch do cout ora este programa funciona muito bem mas se pressionarmos tecla enter para continuar teremos de fazer isso duas vezes pois primeira vez ignorada razão que não existe nada no input buffer quando função ignore chamada por isso que tecla enter necessita de ser pressionada vezes colocando um caractere nova lin
chamada por isso que tecla enter necessita de ser pressionada vezes colocando um caractere nova linha mais no buffer para função ignore remover se tentarmos modificar isto através do if include using namespace std int main void char ch do cout agora sim temos todos os problemas resolvidos isto agora funciona cin cin get cin getline problema anterior do caractere nova linha permanece quando usamos cin get getline juntos num programa uma vez que enter usado para terminar entrada include using namespace std int main void char name int coursenum cout coursenum cout aqui neste exemplo nós não tivemos oportunidade de colocar nome quando digitamos número depois pressionamos tecla enter cin coloca número no coursenum mas caractere nova linha permanece no input buffer que fica para enter name pois getline lê espaços em branco solução pode ser include using namespace std int main void char name int coursenum cout coursenum cin ignore cout partir destes exemplos podemos criar umas regras colocar sempre função ignore depois do cin do razão cin deixa sempre nova linha no input buffer assim devemos eliminá lo com função ignore não colocar função ignore no caso de ser sem parâmetros depois do getline razão getline remove caractere nova linha que termina entrada do input buffer portanto não necessário ignore verificar se temos caractere nova linha no input buffer depois de utilizar get se tivermos deveremos utilizar ignore razão função get com um argumento deixa caractere nova linha no input buffer se pressionarmos um caractere enter mas não deixará se apenas pressionarmos enter portanto necessário confirmar entrada de valores para variáveis múltiplas podemos fazer com que programa receba vários valores ao mesmo tempo cin first variable second variable third variable neste caso utilizador separa os dados por espaços enter também dá como anteriormente utilizador fecha utilizando enter include include using namespace std int main void int peso altura string nome cout nome peso altura cout note se que no exemplo anterior poderíamos colocar as variáveis mesmo no caso de elas serem de tipos diferentes temos de ter atenção na ordem de entrada pergunta se escrevêssemos duas palavras para nome apenas primeira que apareceria palavra que estava separada da primeira para um espaço seria colocada na variável peso