Buscar

Entrada e Saída Arquivo em C++

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 49 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 49 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 49 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1
C++
Entrada e Saída 
Arquivo
Osmar de Oliveira Braz Junior
2
Objetivos
◼ Assuntos a serem abordados nesta 
apresentação
Arquivo
Organização 
Tipos de Arquivos
Fluxos de bytes 
Manipulação de Arquivos Textos
Manipulação de Arquivos Binários
3
Arquivos
◼ Um arquivo é de suma importância nos programas computacionais, desde o 
tempo em que o primeiro computador surgiu, pois, para que um programa faça 
algum tipo de operação, o mesmo precisa ser alimentado com informações: 
estas, ou são fornecidas pelo teclado, o que atualmente torna-se inviável, ou 
são fornecidos através de um arquivo. 
◼ As estruturas de dados fora do ambiente do programa são conhecidas como 
arquivos. Considera-se como ambiente do programa a memória principal, 
onde nem sempre é possível ou conveniente manter certas estruturas de dados.
◼ Um arquivo é armazenado em um dispositivo de memória secundária, como 
discos, por exemplo, pode ser lido ou escrito por um programa.
◼ Um arquivo é formado por uma coleção de registros, cada registro é composto 
por campos e cada campo possui suas características específicas. Um ou mais 
campos desse registro é considerado campo-chave, que é o campo que 
diferencia um registro dos demais, evitando duplicidade de informações.
◼ Um sistema de banco de dados é composto por um ou vários arquivos, onde 
cada arquivo possui programas de manutenção que são: inclusão, exclusão 
lógica ou exclusão física, alteração, consulta geral, consulta específica e 
relatórios.
4
Persistência
◼ O armazenamento dos dados em variáveis ou vetores é temporário
pois utiliza memória volátil.
◼ Para o armazenamento de longo prazo, ou seja para além do termino 
do programa que criou os dados é necessário utilizar memória não 
volátil.
◼ Dados persistentes - existem além da duração da execução do 
programa.
◼ Arquivos são armazenados em dispositivos de armazenamento 
secundários, como disco rígidos, flash drive, etc..
◼ Fluxo – São dados ordenados lidos de ou gravados em um arquivo.
5
Hierarquia dos Dados
◼ Os itens de dados processados pelos 
computadores formam uma hierarquia de dados 
que se torna maior e mais complexa partindo dos 
bits(-) até os arquivos(+).
 Bit - a menor unidade de informação de um computador, pode ter 
valores 0 ou 1.
 Byte - um conjunto de 8 bits.
 Campo - um grupo de caracteres ou bytes que carregam um 
significado.
 Registro - um grupo de campos relacionados.
 Arquivo - um grupo de registros relacionados.
6
Arquivo
Registro2 Maria Rua Y ...
Maria Campo
00000000 01001101 Byte
cliente.dat
1 Joao Rua X ...
2 Maria Rua Y ...
3 Pedro Rua Z ...
4 Luiz Rua W ...
... ... ... ...
0 Bit
7
Hierarquia dos Dados
◼ Junto com arquivos além da complexidade 
existe semântica na sua organização e acesso:
 Chave de registro – identifica um registro como 
pertencente a uma pessoa ou entidade particular –
utilizada para fácil recuperação de registros específicos.
 Arquivo de acesso Sequencial –arquivo em que os 
registros são armazenados pela ordem do campo chave 
de registro.
 Arquivo de acesso Randômico ou Aleatório –arquivo 
em que os registros são armazenados pela ordem do 
campo chave de registro.
8
Arquivo e Fluxo
◼ C++ vê cada arquivo como um fluxo ou sequência de 
bytes.
◼ O sistema operacional fornece um mecanismo para 
determinar o final do arquivo.
 Como um marcador de fim do arquivo ou uma contagem do total de 
bytes no arquivo que é registrado nos dados mantidos na estrutura 
do sistema.
 Um programa C++ que processa um fluxo de bytes recebe uma 
indicação do sistema operacional sobre quando o programa alcança 
o final do fluxo(arquivo).
9
Arquivo e Fluxo
◼ Tipos de Fluxos de Arquivos:
 Fluxos baseados em bytes –representam dados no 
formato binário.
◼ Arquivos binários –criados a partir de fluxos baseados em bytes, lidos 
por um programa que converte os dados em formato legível por 
humanos.
 Fluxos baseados em caracteres – armazenam os dados 
como uma sequência de texto(caracteres).
◼ Arquivos de texto –criados a partir de fluxos baseados em caracteres, 
eles podem ser lidos por editores de textos.
10
Organização de Arquivo
◼ As operações básicas que podem ser feitas 
em um arquivo através de um programa são: 
obtenção de um registro do arquivo(consulta), 
 inserção de um novo registro, 
modificação de um registro. 
exclusão de um registro. 
◼ Dependendo do tipo de problema, estas 
operações poderão ocorrer em maior ou 
menor número.
11
Organização de Arquivo
◼ A disposição dos registros no arquivo pode 
favorecer determinadas operações em detrimento 
de outras. O conhecimento das possibilidades de 
organização dos registros no arquivos permite ao 
programador escolher aquela que seja mais 
adequada à solução do seu problema em termos 
de eficácia e eficiência.
◼ Basicamente, existem duas possibilidades de 
organização de arquivo: 
 organização texto, na qual os registros são obtidos ou 
inseridos no arquivo em ordem sequencial; 
 organização binária, em que o acesso do registro é 
feito em ordem aleatória. 
12
Arquivo Texto
◼ A principal característica é a de que os dados são armazenados 
contiguamente, isto é um após o outro. 
◼ Como consequência, o acesso aos registros do arquivo, tanto na leitura quanto 
na escrita são feitos sequencialmente, ou seja, a leitura de um registro só é 
possível após a leitura de todos os registros anteriores e a escrita de um 
registro só é feita após o ultimo registro.
◼ Um arquivo do tipo texto, também conhecido por arquivo sequencial, é um tipo 
especial de arquivo que, ao contrário do arquivo binário, pode ser editado 
normalmente através de um editor de textos qualquer. Ele é dito sequencial 
porque a leitura tem que ser feita sequencialmente do início ao fim do arquivo.
◼ Nos arquivos do tipo texto, todas as informações lá armazenadas são texto 
(char), mesmo assim, é possível escrever no arquivo informações de qualquer 
tipo de dado simples (int, float) as quais, ao serem fisicamente armazenadas no 
arquivo, serão automaticamente convertidas do seu tipo original para o tipo 
Literal. 
 Na leitura da informação em um arquivo texto, a mesma precisa ser convertida para o tipo da 
variável necessário para o restante do processamento.
13
Arquivo Texto
LINHA1
LINHA2
LINHA NUMERO 3
LINHA NUMERO QUATRO
ARQUIVO.TXT
Use o bloco de notas ou 
outro editor de arquivos 
tipo texto para editar o 
arquivo.
14
Entrada e Saída(I/O)
◼ A linguagem C++ possui uma biblioteca padrão que foi criada seguindo 
os princípios da programação orientada a objetos. Desta forma vários 
objetos já estão prontos para serem utilizados e incorporados. 
◼ A biblioteca para entrada e saída (I/O) possui uma série de classes que 
permitem adicionar uma série de funcionalidades aos programas 
escritos em C++ 
◼ A biblioteca de entrada e saída(I/O) utilizada pelo C++ simplifica a 
sintaxe em relação ao C tradicional 
◼ Para entrada e saída e utilizado o conceito de uma Stream/Fluxo de 
bytes. 
◼ Para utilizar a biblioteca de I/O para saída padrão utilize o include: 
#include <iostream>
Para utilizar a biblioteca de I/O para saída em arquivo utilize o include: 
#include <fstream>
15
Entrada e Saída(I/O)
◼ O conceito de Stream pode ser entendido como um fluxo de informação 
que pode entrar ou sair de um programa para uma fonte de informação 
que pode ser um arquivo, a memória, o teclado ou o vídeo 
◼ Desta forma a escrita para qualquer um destes meios utiliza-se 
basicamente a mesmas classes, facilitando seu uso: 
16
Fluxos de Entrada e Saída(I/O)
◼ Há várias fontes de onde se desejar ler ou destinos para 
onde se deseja gravar ou enviar dados.
 arquivos
 conexões de rede
 console ( teclado / tela)
 memória 
◼ Formas diferentes de ler/escrever
 sequencialmente /aleatoriamente
 como bytes / como caracteres
 linha por linha / palavra por palavra, ...
◼ APIs C++ para I/O oferecem objetos que abstraemfontes/destinos (nós) e fluxos de bytes e caracteres
17
Entrada e Saída(I/O)
◼ O buffer consiste em uma área de memória onde as informações são 
lidas ou escritas. 
◼ O acesso ao buffer ocorre na velocidade da RAM enquanto os 
dispositivos de O acesso ao buffer ocorre na velocidade da RAM 
enquanto os dispositivos de entrada e saída (teclado; disco; etc.) 
trabalham em uma velocidade de acesso muito menor. 
◼ Quando parte de um arquivo é necessária, normalmente um maior 
volume de informações e lido e transferido para o buffer, quando uma 
próxima parte desta informação é necessária o seu conteúdo já se 
encontra no buffer. 
◼ A utilização de um buffer reduz o número de acessos necessários a 
disco, por exemplo, e desta forma este tipo de i/o é mais eficiente.
◼ Em C+ + existem buffers do tipo “Unit-buffering” e “Full buffering”. 
◼ O primeiro tipo armazena a informação em linhas o segundo tipo 
armazena várias linhas até que as mesmas sejam removidos da 
memória (flush)
18
C++ Entrada e Saída(I/O)
◼ Algumas Classes
Classe de Saída Objetos Descrição
ostream cout, cerr, clog Saída em console
ofstream Saída em arquivo em disco
ostrstream Saída bufferizada em string
Classe de Entrada Objetos Descrição
istream cin Entrada em console
ifstream Entrada em arquivo em disco
Istrstream Entrada bufferizada em string
19
C++ Entrada e Saída(I/O)
◼ A classe ifstream e ofstream trabalha com entrada de 
dados e saída de dados respectivamente..
◼ Você pode usar a class fstream que permite trabalhar 
tanto com leitura como escrita.
 Possui implementações do write e read simultaneamente.
Normalmente, 
classes que 
começam com 
“i” – input; 
“o” - output
◼ O acesso a um arquivo dentro do programa deve ser feito de forma 
semelhante a uma variável. No programa, o arquivo deve ser declarado e 
aberto, antes que tal acesso possa ser realizado a escrita ou leitura. E no 
final do programa ou sub-rotina que fez a abertura o seu fechamento.
20
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
ofstream arquivo;
//Processamento
return EXIT_SUCCESS; 
}
Arquivo Texto - Declaração para escrita
Include fstream para trabalhar 
com arquivo.
ofstream classe que manipula 
fluxo de saída/escrita através da 
referência interna “arquivo”.
ifstream classe que manipula 
fluxo de entrada/leitura.
21
Arquivo Texto - Parâmetros Abertura
◼ A abertura de um arquivo é feita através do método open. 
◼ Alguns parâmetros são necessários.
 Nome do arquivo a ser aberto
 E um ou mais parâmetros abaixo concatenados com |.
Parâmetro Origem Função
in input Abre um arquivo existente para leitura.
out output
Cria e abre um novo arquivo; se o arquivo já existe, todos seus 
dados são apagados.
binary binary
Executa operações no modo binário ao invés de texto. (default é 
texto)
ate at end A posição de saída no final do arquivo.(Leitura e gravação)
app append
Abre um arquivo existente, posicionando o ponteiro do arquivo no 
final, permitindo adicionar linhas (os dados já existentes não são 
modificados) 
trunc truncate
Qualquer conteúdo que exista no arquivo antes de ser aberto será 
descartado.
22
Arquivo Texto - Abertura para escrita
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
ofstream arquivo;
arquivo.open("ARQUIVO.TXT", fstream::out);
if (arquivo.is_open()) {
//Processamento
} else {
cout << "Arquivo não pode ser aberto";
} 
return EXIT_SUCCESS; 
}
O parâmetro fstream::out cria e abre 
arquivo chamado “ARQUIVO.TXT” para 
escrita. Dados do arquivo já existente são 
apagados.
O método is_open() verifica se o arquivo 
foi aberto e pode ser utilizado.
Erros que podem ocorrer na abertura de arquivos 
podem ser a falta do arquivo, falta de permissão 
ou quando não há mais espaço em disco.
23
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
ofstream arquivo;
arquivo.open("ARQUIVO.TXT", fstream::app);
if (arquivo.is_open()){
arquivo << "Uma linha" << endl;
arquivo << "Uma outra linha." << endl;
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS; 
}
Arquivo Texto - Escrevendo
O método close() é chamado 
depois de enviar o texto.
É utilizado o << da mesma 
forma que o texto enviado 
para o console.
Abre arquivo chamado “ARQUIVO.TXT” 
para escrita e adiciona os dados ao final. 
Dados do arquivo já existente não são 
apagados. 
O endl forçar a gravação dos 
dados em disco e insere um 
caracter de fim-de-linha (´\n´) ele 
descarrega (ou esvazia) (flush) 
o buffer de saída no mesmo.
24
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
const char NOME_ARQUIVO[] = "AGENDA.TXT";
int main(int argc, char *argv[]){
ofstream arquivo; 
cout << "Adicionar novos dados no arquivo existente? (S-Sim/N-Não):"; 
char adicionar = getchar(); 
if (adicionar =='S'){
arquivo.open(NOME_ARQUIVO,ios::app);
} else { 
arquivo.open(NOME_ARQUIVO);
}
if (arquivo.is_open()) { 
char nome[80];
cout << "Digite um nome ou ENTER para sair:";
fflush(stdin); gets(nome);
while (nome[0]!='\0') {
//Envia o nome para o arquivo
arquivo << nome << endl;
cout << "Digite um nome ou ENTER para sair:";
fflush(stdin); gets(nome);
}
} else {
cout << "Arquivo não pode ser aberto" ;
} 
arquivo.close(); 
return EXIT_SUCCESS; 
}
Abre um arquivo existente para 
adicionar novos dados ou cria um 
novo.
Enquanto não for digitado um nome que 
seja NULO armazena os nomes no arquivo.
Arquivo Texto - Escrevendo
25
Arquivo Texto - Declaração para Leitura
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
ifstream arquivo;
//Processamento
return EXIT_SUCCESS; 
}
Include fstream para trabalhar 
com arquivo.
ifstream classe que manipula 
fluxo de entrada/leitura através 
da referência interna “arquivo”.
26
Arquivo Texto - Abertura para leitura
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
Ifstream arquivo;
arquivo.open("ARQUIVO.TXT", ios::in);
if (arquivo.is_open()) {
//Processamento
} else {
cout << "Arquivo não pode ser aberto";
} 
return EXIT_SUCCESS; 
}
O parâmetro ios::in abre arquivo 
chamado “ARQUIVO.TXT” para leitura. 
Erros que podem ocorrer na abertura de arquivos e 
podem ser o arquivo não existe, falta de permissão 
ou quando não há mais espaço em disco.
O método is_open() verifica se o arquivo 
foi aberto e pode ser utilizado.
27
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
ifstream arquivo; 
arquivo.open("ARQUIVO.TXT",ios::in);
if (arquivo.is_open()) {
//Processamento
char linha[80]=""; 
arquivo >> linha;
cout << "Linha 1:" << linha << endl;
arquivo >> linha;
cout << "Linha 2:" << linha << endl;
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS; 
}
Arquivo Texto - Lendo Vetor de char
O método close() é chamado 
depois de enviar o texto.
É utilizado o >> da mesma 
forma que o texto lido do 
teclado. A leitura está 
sendo armazenado na 
variável linha.
Abre arquivo chamado “ARQUIVO.TXT” 
para leitura.
O cout está exibindo o 
conteúdo da variável linha.
28
Arquivo Texto - Leitura 1
Vetor de char com eof
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
const char NOME_ARQUIVO[] = "AGENDA.TXT";
int main(int argc, char *argv[]){
ifstream arquivo;
arquivo.open(NOME_ARQUIVO,ios::in);
if (arquivo.is_open()){
char nome[80]="";
while (!arquivo.eof()) {
arquivo >> nome;
cout << "Nome:" << nome << endl; 
} 
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS; 
}
Enquanto não for fim do arquivo.
Realiza a leitura de um nome.
Escreve na tela o nome lido.
Nome1
Nome dois
Nome do Numero tres
AGENDA.TXT
29
Arquivo Texto - Leitura 2
Vetor de char com ‘\0’
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
const char NOME_ARQUIVO[] = "AGENDA.TXT";
int main(int argc, char *argv[]){
ifstream arquivo;
arquivo.open(NOME_ARQUIVO,ios::in);
if (arquivo.is_open()) {
char nome[80]=""; 
arquivo.getline(nome,80);
while (nome[0]!='\0') {
cout << "Nome:" << nome << endl;
arquivo.getline(nome,80);
} 
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS; 
}
Enquanto não for NULO faça
Realiza a leitura de 80 caracteres da próxima linha.
Escreve na tela o nome lido.
Nome1
Nome dois
Nome do Numero três
AGENDA.TXT
Realiza a leitura de 80 caracteres da primeira em linha.
30
Arquivo Texto - Leitura 1
string com eof
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
const char NOME_ARQUIVO[] = "AGENDA.TXT";
int main(int argc, char *argv[]){
ifstream arquivo;
arquivo.open(NOME_ARQUIVO,ios::in);
if (arquivo.is_open()) {
string nome = ""; 
while (!arquivo.eof()) {
getline(arquivo,nome);
cout << "Nome:" << nome << endl;
} 
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS; 
}
Enquanto não fim do arquivo
Escreve na tela o nome lido.
Realiza a leitura da linha.
Nome1
Nome dois
Nome do Numero três
AGENDA.TXT
31
Arquivo Texto - Leitura 2
string com “”
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
const char NOME_ARQUIVO[] = "AGENDA.TXT";
int main(int argc, char *argv[]){
ifstream arquivo;
arquivo.open(NOME_ARQUIVO,ios::in);
if (arquivo.is_open()) {
string nome = ""; 
getline(arquivo,nome);
while (nome != "") {
cout << "Nome:" << nome << endl;
getline(arquivo,nome);
} 
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS; 
}
Enquanto não diferente de “”
Realiza a leitura da próxima linha.
Escreve na tela o nome lido.
Nome1
Nome dois
Nome do Numero três
AGENDA.TXT
Realiza a leitura da primeira linha.
32
Arquivo Binário
◼ Um arquivo do tipo binário é também conhecido por arquivo randômico, ou de 
acesso aleatório. Ele é caracterizado pelo fato de ser possível buscar uma 
determinada informação em qualquer posição que a mesma se encontre, sem 
haver a necessidade de se percorrer todo o arquivo até se alcançar a 
informação desejada. 
◼ O acesso à informação(leitura) é direto sendo feito através da função seekg.
◼ O acesso à informação(escrita) é direto sendo feito através da função seekp.
◼ Um arquivo binário aberto pode sofrer tanto leitura com escrita de dados. A 
operação de escrita pode ser em qualquer parte do arquivo. Sendo feito em 
uma posição livre significa inclusão. Se for feita a inclusão em uma posição 
utilizada temos uma atualização. 
◼ Para a exclusão de dados temos duas maneiras: a exclusão física, em que 
após a eliminação de um registro, os demais registros devem ser deslocados, e 
a exclusão lógica, em que os registros possuem um campo adicional, 
identificando se os mesmos estão ativos ou inativos, isto é, se foram excluídos. 
◼ Durante nossas implementações com arquivo binário iremos utilizar a exclusão 
lógica.
33
Arquivo Binário
◼ Arquivo com 5 registros de 100 bytes
100
bytes
0
100
bytes
100
100
bytes
200
100
bytes
300
100
bytes
400
4 bytes 4 bytes 92 bytes (95 caracteres)
int float char
34
Arquivo Binário - Declaração para escrita
◼ O acesso a um arquivo binário dentro do programa é feito da mesma 
maneira que a leitura e escrita de variáveis. No programa, o arquivo deve 
ser declarado e aberto, antes que tal acesso possa ser feito a leitura ou 
escrita. E no final do programa ou sub-rotina que fez a abertura o seu 
fechamento.
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
ofstream arquivo;
//Processamento
return EXIT_SUCCESS; 
}
Include fstream para trabalhar 
com arquivo.
ofstream classe que manipula 
fluxo de saída/escrita através da 
referência interna “arquivo”.
ifstream classe que manipula 
fluxo de entrada/leitura.
35
Arquivo Binário - Parâmetros Abertura
◼ A abertura de um arquivo é feita através do método open. 
◼ Alguns parâmetros são necessários.
 Nome do arquivo a ser aberto
 E um ou mais parâmetros abaixo concatenados com |.
Parâmetro Origem Função
in input Abre um arquivo existente para leitura.
out output
Cria e abre um novo arquivo; se o arquivo já existe, todos seus 
dados são apagados.
binary binary
Executa operações no modo binário ao invés de texto. (default é 
texto)
ate at end A posição de saída no final do arquivo.(Leitura e gravação)
app append
Abre um arquivo existente, posicionando o ponteiro do arquivo no 
final, permitindo adicionar linhas (os dados já existentes não são 
modificados) 
trunc truncate
Qualquer conteúdo que exista no arquivo antes de ser aberto será 
descartado.
36
Arquivo Binário - Abertura para escrita
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
ofstream arquivo;
arquivo.open("ARQUIVO.DAT",ios::out|ios::binary); 
if (arquivo.is_open()) {
//Processamento
} else {
cout << "Arquivo não pode ser aberto";
} 
return EXIT_SUCCESS; 
}
O parâmetro ios::out cria e abre arquivo 
chamado “ARQUIVO.DAT” para escrita. 
Dados do arquivo já existente são 
apagados.
Erros que podem ocorrer na abertura de arquivos 
e podem ser a falta do arquivo, falta de permissão 
ou quando não há mais espaço em disco.
O método is_open() verifica se o arquivo 
foi aberto e pode ser utilizado.
37
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
ofstream arquivo; 
arquivo.open("ARQUIVO.DAT",ios::out|ios::binary); 
if (arquivo.is_open()) {
int numint; 
float numfloat;
char linha[92];
cout << "Digite um número inteiro: ";
cin >> numint;
cout << "Digite um número real: ";
cin >> numfloat;
cout << "Digite uma literal (até 92 caracteres):";
fflush(stdin); gets(linha);
arquivo.write((char*)&numint,sizeof(numint));
arquivo.write((char*)&numfloat,sizeof(numfloat));
arquivo.write((char*)&linha,sizeof(linha));
} else {
cout << "Arquivo não pode ser aberto";
}
arquivo.close();
return EXIT_SUCCESS;
}
Arquivo Binário - Escrevendo
O método close() é chamado 
depois de enviar os dados.
Leitura dos valores a serem 
armazenados no arquivo binário.
Abre arquivo chamado “ARQUIVO.DAT” para escrita e adiciona 
os dados ao final. Dados do arquivo já existente são apagados. 
write escreve o 
conteúdo das 
variáveis como 
char de acordo 
com o tamanho da 
variável 
declarada(sizeof).
38
Arquivo Texto - Escrita
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
struct pessoa {
char nome[96];
int idade;
};
int main(int argc, char *argv[]){
ofstream arquivo; //Saida
arquivo.open("AGENDA.DAT",ios::out|ios::binary|ios::app); 
if (arquivo.is_open()) {
pessoa reg;
cout << "Digite um nome ou ENTER para sair:";
fflush(stdin); gets(reg.nome);
while (reg.nome[0]!='\0'){ 
cout << "Digite a Idade:";
cin >> reg.idade; 
arquivo.seekp(0,arquivo.end);
arquivo.write((char*)&reg, sizeof(pessoa));
cout << "Digite um nome ou ENTER para sair:";
fflush(stdin); gets(reg.nome);
} 
} else{
cout << "Arquivo não pode ser aberto: " << arquivo.rdstate();
}
arquivo.close();
return EXIT_SUCCESS;
}
Abre um arquivo existente e permite 
adicionar novos registros.
Enquanto nome for diferente de NULO 
armazena os nomes no arquivo.
Arquivo Binário - Escrevendo
Agrupa os dados na struct pessoa para 
facilitar o armazenamento.
Usa seekp para posicionar no final 
do arquivo para escrever o novo 
registro.
39
Arquivo Binário - Escrita
◼ Neste exemplo de escrita de registros de pessoa no arquivo 
“AGENDA.DAT” ocorre sempre no fim do arquivo.
◼ Para se realizar a escrita sempre no fim é necessário utilizar o comando 
seekp combinado com o ponteiro de final de arquivo ios::end. 
◼ Se desejar saber onde está o ponteiro utilize o método tellp para 
retornar a posição de escrita. 
◼ Ponteiros no arquivo:
 ios::beg - início do stream.
 ios::cur - posição corrente no stream.
 ios::end - fim do stream.
40
Arquivo Binário - Escrita
◼ No exemplo anterior e gravação de registros de pessoa no 
arquivo “AGENDA.DAT” ocorre sempre no final do arquivo. 
◼ Repare que a abertura posicionou o ponteiro de gravação 
no final através de ios::app.
41
Arquivo Binário - Declaração para Leitura
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
ifstream arquivo;
//Processamento
return EXIT_SUCCESS; 
}
Include fstream para trabalhar 
com arquivo.
ifstream classe que manipula 
fluxo de entrada/leitura através 
da referência interna “arquivo”.
42
Arquivo Binário - Abertura para leitura
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){ 
ifstream arquivo;
arquivo.open("ARQUIVO.DAT",ios::in|ios::binary); 
if (arquivo.is_open()) {
//Processamento
} else {
cout << "Arquivo não pode ser aberto";
} 
return EXIT_SUCCESS; 
}
O parâmetro ios::in abre arquivo 
chamado “ARQUIVO.DAT” para leitura. 
Erros que podem ocorrer na abertura de arquivos 
e podem ser a falta do arquivo, falta de permissão 
ou quando não há mais espaço em disco.
O método is_open() verifica se o arquivo 
foi aberto e pode ser utilizado.
43
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
int main(int argc, char *argv[]){
ifstream arquivo; 
arquivo.open("ARQUIVO.DAT",ios::in|ios::binary); 
if (arquivo.is_open()) {
int numint;
float numfloat;
char linha[92];
arquivo.read((char*)&numint,sizeof(numint));
cout << "Número inteiro: " << numint << endl;
arquivo.read((char*)&numfloat,sizeof(numfloat));
cout << "Número real: " << numfloat << endl; 
arquivo.read((char*)&linha,sizeof(linha));
cout << "Literal (até 92 caracteres): " << linha << endl; 
} else {
cout << "Arquivo não pode ser aberto";
}
arquivo.close();
return EXIT_SUCCESS;
}
Abre arquivo chamado “ARQUIVO.DAT” 
para leitura.
O cout está exibindo o 
conteúdo da variáveis lidas.
Arquivo Binário - Lendo
read lê o conteúdo 
dos arquivos para 
as variáveis como 
char de acordo 
com o tamanho da 
variável 
declarada(sizeof).
O método close() é chamado 
depois de ler os dados.
44
Arquivo Binário - Leitura
◼ Neste exemplo de leitura de registros de pessoa no arquivo “AGENDA.DAT” ocorre 
sempre a partir do primeiro registro do arquivo até o fim. 
◼ Logo após a abertura do arquivo o mesmo é posicionado no fim do arquivo encontra na 
posição ios::end utilizando o método seekg para retornar o tamanho do arquivo.
◼ Depois é posicionado no primeiro registro que se encontra na posição 0 utilizando o 
método seekg e o ponteiro ios::beg.
◼ Para se realizar a leitura de todos os registros é necessário utilizar o comando seekg
combinado com o comando tellg. A estrutura de repetição faz com que seja lidos 
registros enquanto o comando tellg retornar a posição de leitura atual menor que o 
tamanhoArquivo. 
◼ Atenção: Não é necessário posicionar o ponteiro para a próxima leitura pois após a 
leitura de um registro o ponteiro se posiciona no inicio do próximo e assim por diante.
◼ Ponteiros no arquivo:
 ios::beg - início do stream.
 ios::cur - posição corrente no stream.
 ios::end - fim do stream.
45
Posicionamento
46
#include <iostream> //cout, endl
#include <cstdlib> //EXIT_SUCCESS
#include <fstream>
using namespace std;
struct pessoa {
char nome[96];
int idade;
};
int main(int argc, char *argv[]){
ifstream arquivo;
arquivo.open("AGENDA.DAT",ios::in|ios::binary); 
if (arquivo.is_open()){
pessoa reg;
arquivo.seekg(0,arquivo.end); //Posiciona no final do arquivo
int tamanhoArquivo = arquivo.tellg(); //Retorna o tamanho do arquivo
arquivo.seekg(0,arquivo.beg); //posiciona no inicio do arquivo para leitura
while(arquivo.tellg() < tamanhoArquivo ) {
arquivo.read((char*) &reg, sizeof(pessoa)); 
cout << "Nome:" << reg.nome << " Idade:"<< reg.idade << endl;
}
} else {
cout << "Arquivo não pode ser aberto";
} 
arquivo.close();
return EXIT_SUCCESS;
}
Enquanto não for fim do arquivo.
Realiza a leitura de um registro.
Escreve na tela os dados do 
registro lido.
Arquivo Binário - Lendo
O método tellg retorna a posição 
de leitura em bytes do arquivo.
O método seekg posiciona o 
ponteiro de leitura em uma posição 
do final(end) do arquivo.
47
Conclusão
◼ Persistir dados é necessário, caso contrário 
sempre teremos que digitar dos dados de 
entrada a cada processamento ou executar uma 
entrada para ter os dados de saída.
◼ Arquivos é a opção para armazenamento de 
dados sem a utilização de grandes recursos.
◼ Defina sua necessidade de armazenamento e 
operações para identificar se é necessário um 
arquivo texto ou binário.
48
Bibliografia/Referências
◼ Stroustrup, Bjarne. The C++ Programming 
Language. 2019. Disponível em: 
“http://www.stroustrup.com/C++.html” 
49
Fim

Outros materiais