Dominando Streams em C++: cout, cin, cerr, clog – Guia Prático
O que São Streams em C++?
O C++ abstrai entrada e saída através de uma família de classes de stream que transferem dados como sequências de bytes. Esses streams são a espinha dorsal de toda operação de I/O na linguagem.
Streams dividem-se em duas categorias:
Tipos de Streams
- Input Streams (Streams de Entrada) – Recebem dados de dispositivos como teclados ou arquivos e os colocam na memória.
- Output Streams (Streams de Saída) – Enviam dados da memória para dispositivos como monitores ou arquivos.
Este tutorial cobrirá:
- Fundamentos de streams
- Como streams operam internamente
- Classes de stream principais e suas funções
- Arquivos de cabeçalho C++ para I/O
- Usando std::cout, std::cin, std::cerr e std::clog
- Tratamento de erros com objetos stream
Como Streams Funcionam
O fluxo típico de uma operação de stream C++ é:
- Instancie um objeto stream do tipo apropriado.
- Associe o stream a um dispositivo ou arquivo usando ponteiros get/put.
- Realize I/O via operadores de extração (
>>) ou inserção (<<).
Visão Geral das Funções de Stream
O cabeçalho streambuf fornece várias classes que gerenciam buffers de arquivo:
| Classe | Descrição |
|---|---|
| filebuf | Gerencia buffers de arquivo para leitura/escrita. Fornece open() e close(). |
| fstreambase | Base para ifstream, fstream e ofstream – operações comuns de file stream. |
| ifstream | Input file stream para leitura de dados. |
| ofstream | Output file stream para escrita de dados. |
| fstream | Stream combinado de entrada/saída. |
Arquivos de Cabeçalho C++ para I/O
- iostream – Fornece
cin,cout,cerreclog. - iomanip – Oferece manipuladores como
setwesetprecision. - fstream – Manipula streams baseados em arquivo.
Todos esses objetos são definidos em iostream; omitir o cabeçalho dispara erro de compilação.
std::cout
O objeto cout escreve no stream de saída padrão, geralmente o console. É usado com o operador de inserção (<<).
Exemplo
#include <iostream>
using namespace std;
int main() {
char boas_vindas[] = "Bem-vindo ao Guru99";
cout << boas_vindas << endl;
return 0;
}
Análise do Código:
- Inclui
iostreampara acessarcout. - Usa namespace
stdpara evitar prefixos. - Define array de caracteres contendo a mensagem.
- Imprime a mensagem com
endlpara inserir nova linha. - Retorna
0para indicar sucesso.
std::cin
O objeto cin lê do stream de entrada padrão, tipicamente o teclado. Ele combina com o operador de extração (>>).
Exemplo
#include <iostream>
using namespace std;
int main() {
int numero;
cout << "Digite um número: ";
cin >> numero;
cout << "\nVocê digitou: " << numero;
return 0;
}
Análise do Código:
- Inclui
iostreamparacinecout. - Usa namespace
std. - Declara variável inteira.
- Solicita ao usuário.
- Lê entrada com
>>. - Repete o valor inserido.
- Retorna
0em sucesso.
std::cerr
O stream cerr imprime mensagens de erro imediatamente porque não é bufferizado. Use-o para erros críticos que devem ser mostrados de imediato.
Exemplo
#include <iostream>
using namespace std;
int main() {
cerr << "Ocorreu um erro!";
return 0;
}
std::clog
Diferente de cerr, clog é bufferizado, armazenando mensagens até o buffer ser descarregado. É útil para logging que pode ser atrasado.
Exemplo
#include <iostream>
using namespace std;
int main() {
clog << "Ocorreu um erro!";
return 0;
}
Tratamento de Erros com Objetos Stream
Streams podem ser avaliados em contexto booleano para verificar sua validade. Além disso, funções membro fornecem verificações de status granulares:
good()– true se nenhum erro ocorreu.bad()– true se erro fatal está definido.fail()– true após operação malsucedida.eof()– true quando fim do stream é atingido.
Exemplo – verificando abertura de arquivo:
ifstream arquivo("meuarquivo.txt");
if (!arquivo) {
cout << "Arquivo NÃO aberto!" << endl;
}
Exemplo – validando entrada do usuário:
int p;
if (cin >> p) {
cout << "Número válido inserido" << endl;
}
Resumo
- Em C++, I/O é realizado através de streams que transferem sequências de bytes.
- Input streams movem dados de dispositivo para memória; output streams movem dados de memória para dispositivo.
cin(istream) lê entrada do teclado.cout(ostream) escreve no console.cerr(ostream) exibe mensagens de erro imediatas.clog(ostream) bufferiza saída de erro para descarregamento posterior.- Streams bufferizados podem ser verificados com
good(),bad(),fail()eeof().
Linguagem C
- Fundamentos de C#: Essenciais de Entrada e Saída
- Dominando Entrada e Saída em C++: Guia Prático
- Dominando Entrada e Saída (I/O) em C: scanf() e printf() Explicados
- Dominando Entrada e Saída em Java: Imprimir, Ler e Formatados Seus Dados
- Dominando Switch-Case em C++: Sintaxe, Uso e Exemplos Práticos
- Dominando Tratamento de Exceções em C++: Exemplos Práticos com Try, Catch, Throw
- Dominando Alocação Dinâmica de Arrays em C++: Guia Prático com Exemplos de Código
- Structs em C++ Explicadas com Exemplo Prático
- Dominando Latches D: Projeto, Operação e Diferenças Principais
- Dominando Entrada e Saída em Programação C