Da trilha de C++ Este conceito ainda não saiu como card do dia. ir para o card de hoje

C++ I/O Básico

Entrada e saída com iostream

Em C++, a entrada e saída padrão são feitas com os fluxos std::cin e std::cout, definidos no cabeçalho <iostream>. O operador << insere dados no fluxo de saída, enquanto >> extrai dados do fluxo de entrada. Por padrão, cin e cout são sincronizados com as funções C (scanf/printf), mas você pode desativar essa sincronia para melhorar o desempenho.

A leitura com >> para no primeiro caractere de espaço em branco, o que pode ser um problema ao ler strings com espaços. Para ler uma linha inteira, incluindo espaços, usa-se std::getline. É importante lembrar que getline não descarta o caractere de nova linha deixado por leituras anteriores, então muitas vezes é necessário consumi-lo antes.

Os manipuladores de fluxo, como std::endl, std::fixed, std::setprecision e std::setw, permitem controlar a formatação da saída. Eles são definidos em <iomanip> (exceto endl). A partir do C++20, std::format oferece uma alternativa moderna e segura para formatação de strings, similar ao printf, mas com verificação de tipos em tempo de compilação.

Neste card, você verá exemplos práticos de como usar cout, cin, getline, manipuladores e std::format para realizar entrada e saída de dados de forma idiomática e eficiente.

Pontos-chave

  • std::cout e std::cin são os fluxos padrão de saída e entrada, definidos em <iostream>.
  • Use std::getline(std::cin, linha) para ler uma linha inteira, incluindo espaços.
  • Manipuladores como std::fixed, std::setprecision e std::setw controlam a formatação da saída.
  • std::format (C++20) permite criar strings formatadas de forma segura e expressiva.
  • Após ler com >>, pode ser necessário limpar o buffer com std::cin.ignore() antes de usar getline.
io_basico.cpp
#include <iostream>
#include <iomanip>
#include <string>
#include <format>

int main() {
    // Saída simples com cout
    std::cout << "Digite seu nome completo: ";
    std::string nome;
    std::getline(std::cin, nome); // lê a linha inteira, incluindo espaços

    // Entrada de número inteiro
    std::cout << "Digite sua idade: ";
    int idade;
    std::cin >> idade;

    // Limpa o buffer para remover o '\n' deixado pelo cin >>
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // Entrada de texto com getline após o ignore
    std::cout << "Digite sua cidade: ";
    std::string cidade;
    std::getline(std::cin, cidade);

    // Formatação com manipuladores
    std::cout << std::fixed << std::setprecision(2);
    double altura;
    std::cout << "Digite sua altura (m): ";
    std::cin >> altura;

    // Usando std::format para montar a mensagem final
    std::string mensagem = std::format("Olá, {}! Você tem {} anos, mora em {} e mede {:.2f} m.",
                                       nome, idade, cidade, altura);
    std::cout << mensagem << std::endl;

    return 0;
}

Exercícios

  1. 1
    Fácil

    Leitura e escrita simples

    Escreva um programa que leia o nome de uma pessoa (apenas uma palavra) e sua idade, e então imprima uma mensagem no formato: Nome: [nome], Idade: [idade] anos.

    Resolver
  2. 2
    Médio

    Leitura de linha completa e formatação

    Escreva um programa que leia o nome completo de uma pessoa (com espaços) e um valor em reais (double). Em seguida, imprima o nome e o valor formatado com duas casas decimais, usando std::fixed e std::setprecision. A saída deve ser: Nome: [nome]\nValor: R$ [valor].

    Resolver
  3. 3
    Desafio

    Formulário com validação e std::format

    Crie um programa que leia os seguintes dados de um usuário: nome completo (linha), idade (int), altura (double) e cidade (linha). Após a leitura, exiba uma ficha formatada usando std::format com as informações alinhadas e a altura com duas casas decimais. A saída deve ser exatamente:

    Nome:     [nome]
    Idade:    [idade] anos
    Altura:   [altura] m
    Cidade:   [cidade]
    

    Considere que a leitura da idade e altura pode deixar o caractere de nova linha no buffer, então use std::cin.ignore() antes de ler a cidade.

    Resolver

Continue estudando