Dominando I/O de Arquivos em C++: Leitura e Escrita com fstream
Até agora, temos usado a biblioteca padrão iostream, que fornece métodos cin e cout para leitura de entrada padrão e escrita em saída padrão, respectivamente.
Este tutorial ensinará como ler e escrever em um arquivo. Isso requer outra biblioteca padrão C++ chamada fstream, que define três novos tipos de dados:
| Nº | Tipo de Dado e Descrição |
|---|---|
| 1 | ofstream Representa stream de saída de arquivo; usado para criar arquivos e escrever informações neles. |
| 2 | ifstream Representa stream de entrada de arquivo; usado para ler informações de arquivos. |
| 3 | fstream Representa stream de arquivo geral; tem capacidades de ofstream e ifstream — pode criar, escrever e ler arquivos. |
Para realizar processamento de arquivos em C++, os headers <iostream> e <fstream> devem ser incluídos no seu arquivo fonte C++.
Abrindo um Arquivo
Um arquivo deve ser aberto antes que você possa ler ou escrever nele. Objetos ofstream ou fstream podem ser usados para abrir um arquivo para escrita. E objeto ifstream é usado para abrir arquivo apenas para leitura.
A seguir está a sintaxe padrão para a função open(), que é membro de fstream, ifstream e ofstream:
void open(const char *filename, ios::openmode mode);
Aqui, o primeiro argumento especifica o nome e localização do arquivo a ser aberto e o segundo argumento da função membro open() define o modo em que o arquivo deve ser aberto.
| Nº | Flag de Modo e Descrição |
|---|---|
| 1 | ios::app Modo append. Toda saída para o arquivo é anexada ao final. |
| 2 | ios::ate Abre arquivo para saída e move controle de leitura/escrita para o final do arquivo. |
| 3 | ios::in Abre arquivo para leitura. |
| 4 | ios::out Abre arquivo para escrita. |
| 5 | ios::trunc Se arquivo já existe, seu conteúdo será truncado antes de abrir. |
Você pode combinar dois ou mais destes valores fazendo OR bit a bit. Por exemplo, se quiser abrir arquivo em modo escrita e truncá-lo se já existir, a sintaxe será:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);
Da mesma forma, você pode abrir arquivo para leitura e escrita como segue:
fstream afile;
afile.open("file.dat", ios::out | ios::in);
Fechando um Arquivo
Quando um programa C++ termina, ele automaticamente dá flush em todos os streams, libera toda memória alocada e fecha todos os arquivos abertos. Mas é sempre uma boa prática que o programador feche todos os arquivos abertos antes da terminação do programa.
A seguir está a sintaxe padrão para a função close(), que é membro de fstream, ifstream e ofstream:
void close();
Escrevendo em um Arquivo
Durante programação C++, você escreve informação em um arquivo do seu programa usando o operador de inserção de stream (<<) da mesma forma que usa para saída na tela. A única diferença é que você usa um objeto ofstream ou fstream em vez do objeto cout.
Lendo de um Arquivo
Você lê informação de um arquivo para seu programa usando o operador de extração de stream (>>) da mesma forma que usa para entrada do teclado. A única diferença é que você usa um objeto ifstream ou fstream em vez do objeto cin.
Exemplo de Leitura e Escrita
O programa C++ a seguir abre um arquivo em modo leitura e escrita. Após escrever informação inserida pelo usuário em um arquivo chamado afile.dat, o programa lê informação do arquivo e a exibe na tela:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
char data[100];
// abre arquivo em modo escrita
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// escreve dados inseridos no arquivo
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// escreve novamente dados inseridos no arquivo
outfile << data << endl;
// fecha arquivo aberto
outfile.close();
// abre arquivo em modo leitura
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// escreve dados na tela
cout << data << endl;
// lê novamente dados do arquivo e exibe
infile >> data;
cout << data << endl;
// fecha arquivo aberto
infile.close();
return 0;
}
Quando o código acima é compilado e executado, produz a seguinte entrada e saída de exemplo:
$./a.out Writing to the file Enter your name: Zara Enter your age: 9 Reading from the file Zara 9
Os exemplos acima fazem uso de funções adicionais do objeto cin, como getline() para ler linha de fora e ignore() para ignorar caracteres extras deixados pela instrução de leitura anterior.
Ponteiros de Posição de Arquivo
Tanto istream quanto ostream fornecem funções membro para reposicionar o ponteiro de posição do arquivo. Estas funções membro são seekg ("seek get") para istream e seekp ("seek put") para ostream.
O argumento para seekg e seekp normalmente é um inteiro longo. Um segundo argumento pode ser especificado para indicar a direção do seek. A direção pode ser ios::beg (padrão) para posicionamento relativo ao início do stream, ios::cur para posicionamento relativo à posição atual no stream ou ios::end para posicionamento relativo ao final do stream.
O ponteiro de posição de arquivo é um valor inteiro que especifica a localização no arquivo como número de bytes a partir do início do arquivo. Alguns exemplos de posicionamento do ponteiro "get":
// posiciona no n-ésimo byte do fileObject (assume ios::beg) fileObject.seekg(n); // posiciona n bytes à frente no fileObject fileObject.seekg(n, ios::cur); // posiciona n bytes atrás do final do fileObject fileObject.seekg(n, ios::end); // posiciona no final do fileObject fileObject.seekg(0, ios::end);
Linguagem C
- Dominando Variáveis, Literais e Constantes em C++: Guia Completo
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- Manipulação de Arquivos em C: Dominando I/O com fopen, fprintf, fread e fseek
- Dominando Operações com Diretórios e Arquivos em Python
- Estruturas vs Classes em C++: Guia Prático para Desenvolvedores Embarcados
- Entendendo Arquivos de Cabeçalho em C: Tipos, Uso e Boas Práticas
- Guia Completo de Data e Hora em C++
- Dominando Sobrecarga em C++: Funções e Operadores Explicados
- O Que é uma Lima Paralela? Guia Completo da Ferramenta Essencial para Marcenaria e Metalurgia