Você está na página 1de 47

Programao de Computadores

Judson Santos Santiago

MANIPULAO DE ARQUIVOS

Introduo
Frequentemente no computador a entrada

de dados feita pelo teclado e a sada de dados feita em tela


Programa
Exibicao do time ----------------------------------------Nome Gols Partidas ----------------------------------------Bebeto (ex-Vasco) 760 900 Neto (ex-Corinthians) 102 400 Pele (ex-Santos) 1000 800 ----------------------------------------Press any key to continue . . .

Introduo
As vezes a entrada de dados pelo teclado no

a melhor opo:
Imagine usar o teclado para entrar com nome,

preo e quantidade em estoque de 1000 produtos

Entrada Programa

Introduo
As vezes a sada de dados pelo teclado no

a melhor opo:
Seria conveniente gerar uma lista de compras de

produtos fora de estoque em um arquivo

Sada Programa

Introduo
Hoje em dia quase a totalidade dos programas de computador trabalham com arquivos:
Editores de texto, planilhas e apresentaes criam

documentos em arquivos Editores de imagens, vdeos e sons criam, organizam e guardam informaes em arquivos Compiladores lem o arquivo fonte de um programa e geram um arquivo executvel

Um arquivo um conjunto de bytes armazenado

em algum dispositivo

Introduo
O sistema operacional se encarrega de:
Gerenciar os arquivos Saber a localizao dos arquivos Guardar informaes como tamanho, data de

criao, ltima modificao, etc.

Como programador estamos interessados em conectar um programa a um arquivo:


Ler informaes do arquivo

Gravar informaes no arquivo

Introduo
Para um programador os arquivos se dividem

em duas categorias:
Arquivos texto: uma sequncia de bits em que um

conjunto de n bits representa um caractere:


Na codificao ASCII um caracatere so 8 bits Em Unicode um caractere so 16 bits Em UTF-8 um caractere tem de 8 a 32 bits
Arquivo texto na codificao ASCII
01000001 01110010 01110001 01110101 01101001 01110110 01101111 01110011 00100000 00001010

'A'

'r'

'q'

'u'

'i'

'v'

'o'

's'

' '

'\n'

Introduo
Para um programador os arquivos se dividem

em duas categorias:
Arquivos binrios: uma sequncia de bits em que

um conjunto de n bits representa uma informao na sua representao nativa (inteira, pontoflutuante, caractere, etc.)
Arquivo binrio
00111110110000000000000000000000 01101001 01110110 01101111 01110011 00100000 00000000000000000000000000001111

0.375

'c'

'a'

's'

'a'

'\0'

15

float

char []

int

Introduo
Diferena entre arquivos texto e binrio:
Representao binria de 0.375
0 0111110 110000000000000000000000

sinal expoente

mantissa

Representao texto de 0.375


01101001 '0' 01101001 '.' 01101001 '3' 01101001 '7' 01101001 '5'

Introduo
A entrada e sada de arquivos em C++ muito

parecida com a entrada e sada no console


Console Console

Arquivo

Entrada

Programa

Sada

Arquivo

Entrada e Sada
Quando utiliza-se cin para ler dados, o

programa v a entrada como uma srie de bytes (caracteres):


Suponha que voc digite a seguinte entrada:
38.5 19.2

A entrada um conjunto de caracteres (bytes)

armazenados no buffer de entrada


00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

Entrada e Sada
Cada byte interpretado como um cdigo de

um caractere (tabela ASCII)


No importa o tipo de destino, a entrada feita

com o tipo caractere, ou seja, texto


cin >> total;

cin tem a responsabilidade de traduzir o texto

para o tipo da varivel utilizada


00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

Entrada e Sada
Entrada usando uma varivel tipo char:
38.5 19.2

O primeiro caractere da entrada atribudo

para a varivel, nenhuma traduo acontece


char ch; cin >> ch;
00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

00110011

ch

Entrada e Sada
Entrada usando uma varivel tipo int:
38.5 19.2

A leitura feita at encontrar o primeiro

caractere que no um dgito


int n; cin >> n;
00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

'3'

'8'

00000000 00000000 00000000 00100110 38

Entrada e Sada
Entrada usando uma varivel tipo float:
38.5 19.2

A leitura feita at encontrar um caractere

que no faz parte de um ponto-flutuante


float x; cin >> x;
00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

'3'

'8'

'.'

'5' =

00000001 00000000 00000001 10000001

38.5

Entrada e Sada
Entrada usando um vetor de caracteres:
38.5 19.2

A leitura feita at encontrar um caractere

em branco, tabulao ou nova linha


char nome[50]; cin >> nome;
00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

'3'

'8'

'.'

'5' =

00110011

00111000

00101110

00110101

00000000

nome

"38.5"

Entrada e Sada
Entrada usando um vetor de caracteres:
38.5 19.2

Usando a funo getline, a entrada lida at

o caractere de nova linha


char nome[50]; cin.getline(nome, 50);
00110011 00111000 00101110 00110101 00100000 00110001 00111001 00101110 00110010 00001101

'3'

'8'

'.'

'5'

' '

'1'

'9'

'.'

'2'

'\n'

00110011

00111000

00101110

00110101

00100000

00110001

00111001

00101110

00110010

00000000

nome

"38.5 19.2"

Entrada e Sada
Em resumo, o texto digitado pelo teclado

recebido sempre em forma de texto e depois convertido para o tipo apropriado


Um arquivo texto se assemelha muito ao buffer do

teclado, isto , ele composto por uma seqncia de caracteres Um arquivo binrio armazena mais que texto:
Planilhas armazenam dados em formato numrico Editores de texto armazenam formatao, fontes, impressoras, etc.

Sada em Arquivos Texto


Para usar cout num programa necessrio:
Incluir o arquivo de cabealho iostream Define uma classe ostream para manipular a sada Declara um objeto da classe ostream chamado cout
#include <iostream>

Considerar que os objetos esto definidos no

espao de nomes std


using namespace std;

// ou
using std::cout;

Sada em Arquivos Texto


Para usar cout num programa necessrio:
Usar cout com o operador de insero << para

mostrar vrios tipos de dados diferentes


char ch = 'M'; float num = 35.4f; cout << ch; cout << num;

Usar cout.setf() e cout.precision() para modificar a

forma de impresso dos dados


float tax = 31.28062; cout.setf(ios_base::fixed, ios_base::floatfield); cout.precision(2); cout << tax;

Sada em Arquivos Texto


Fazer a sada em arquivos semelhante:
Incluir o arquivo de incluso fstream Define uma classe ofstream para manipular a sada Criar um objeto do tipo ofstream Associar um objeto ofstream com um arquivo do

disco usando a funo open() Usar o operador de insero << com o objeto ofstream Fechar o arquivo com a funo close()

Sada em Arquivos Texto


O arquivo de incluso fstream no fornece

um objeto predefinido, preciso criar um:


ofstream arqSaida; ofstream fout; // um objeto ofstream // outro objeto ofstream

E associ-lo com um arquivo do disco:


arqSaida.open("pesca.txt"); char arquivo[50]; cin >> arquivo; fout.open(arquivo); // // // // arqSaida usado para escrever em pesca.txt um vetor de caracteres nome definido pelo usurio abre arquivo definido pelo usurio

Para us-los desta forma:


double wt = 125.8; arqSaida << wt; // escreve um nmero em pesca.txt char linha[81] = "Objetos so variveis de uma classe"; fout << linha << endl; // escreva uma linha de texto

Sada em Arquivos Texto


// escrevendo em arquivo texto #include <iostream> #include <fstream> using namespace std; int main() { char carro[50]; int ano; float precoN; flaot precoP; ofstream arqSaida; arqSaida.open("carinfo.txt"); // cria objeto para sada // associa com arquivo

cout << "Entre com a marca e modelo do carro: "; cin.getline(carro, 50); cout << "Entre com o ano: "; cin >> ano; cout << "Digite o preo normal: "; cin >> precoN; precoP = 0.913 * precoN;

Sada em Arquivos Texto


// mostrando informaes na tela cout << fixed; cout.precision(2); cout << "Marca e modelo: " << carro << endl; cout << "Ano: " << ano << endl; cout << "Preo normal: R$" << precoN << endl; cout << "Preo promocional: R$" << precoP << endl; // gravando informaes no arquivo arqSaida << fixed; arqSaida.precision(2); arqSaida << "Marca e modelo: " << carro << endl; arqSaida << "Ano: " << ano << endl; arqSaida << "Preo normal: R$" << precoN << endl; arqSaida << "Preo promocional: R$" << precoP << endl; arqSaida.close(); system("pause"); return 0; }

Sada em Arquivos Texto


Sada do programa:
Entre com a marca e modelo do carro: Ford Ka Entre com o ano: 2009 Digite o preo normal: 28576
Marca e modelo: Ford Ka Ano: 2009 Preo normal: R$28576.00 Preo promocional: R$26089.89

Arquivo carinfo.txt:
Marca e modelo: Ford Ka Ano: 2009 Preo normal: R$28576.00 Preo promocional: R$26089.89

Sada em Arquivos Texto


O mtodo open():
Cria um novo arquivo se ele no existir Sobrescreve o arquivo, se ele existir
arqSaida.open("carinfo.txt"); // associa com arquivo

A abertura de um arquivo pode falhar caso o

arquivo utilizado seja um arquivo de acesso restrito:


Por exemplo, um arquivo j aberto em outro

programa ou um arquivo protegido do S.O.

Leitura de Arquivos Texto


Para usar cin num programa necessrio:
Incluir o arquivo de incluso iostream Define uma classe istream para manipular a entrada Declara um objeto da classe istream chamado cin
#include <iostream>

Considerar que estes objetos esto definidos no

espao de nomes std


using namespace std; //ou using std::cin;

Leitura de Arquivos Texto


Para usar cin num programa necessrio:
Usar cin com o operador de extrao >> para ler

vrios tipos de dados diferentes


char ch; float num; cin >> ch; cin >> num;

Usar cin.get() para ler caracteres individuais ou

cin.getline() para ler uma linha por vez


char ch; char nome[30]; cin.get(ch); cin.getline(nome, 30);

Leitura de Arquivos Texto


A leitura de arquivos muito semelhante:
Incluir o arquivo de cabealho fstream Define uma classe ifstream para manipular a entrada Criar um objeto do tipo ifstream

Associar um objeto ifstream com um arquivo do

disco usando a funo open() Usar o operador de extrao >>, o mtodo get() ou getline() com o objeto ifstream Fechar o arquivo com a funo close()

Leitura de Arquivos Texto


O arquivo de incluso fstream no fornece

um objeto predefinido, preciso criar um:


ifstream arqEntrada; ifstream fin; // um objeto ifstream // outro objeto ifstream

E associ-lo com um arquivo do disco:


arqEntrada.open("boliche.txt"); char arquivo[50]; cin >> arquivo; fin.open(arquivo); // // // // arqEntrada usado para ler boliche.txt um vetor de caracteres nome definido pelo usurio abre arquivo definido pelo usurio

Para us-los desta forma:


double wt; arqEntrada >> wt; char linha[81]; fin.getline(linha, 81); // l um nmero de boliche.txt // l uma linha de texto

Leitura de Arquivos Texto


Se o arquivo no existir no disco, todas as

tentativas de uso do objeto ifstream vo falhar A melhor forma de checar se um arquivo foi aberto corretamente atravs do mtodo is_open()
arqEntrada.open("boliche.txt"); if (!arqEntrada.is_open()) { cout << "A abertura do arquivo falhou!" << endl; exit(EXIT_FAILURE); }

Leitura de Arquivos Texto


// lendo arquivos texto #include <iostream> #include <fstream> using namespace std; const int TAM = 60; int main() { char arquivo[TAM]; ifstream arqEntrada;

// cria objeto para leitura de arquivo

cout << "Digite nome do arquivo: "; cin.getline(arquivo, TAM); arqEntrada.open(arquivo); // associa com arquivo do disco if (!arqEntrada.is_open()) // a abertura do arquivo falhou { cout << "A abertura do arquivo " << arquivo << " falhou!" << endl; cout << "Programa encerrando.\n"; exit(EXIT_FAILURE); }

Leitura de Arquivos Texto


double valor; double soma = 0.0; int cont = 0; arqEntrada >> valor; while (arqEntrada.good()) { ++cont; soma += valor; arqEntrada >> valor; } // soma dos itens // nmero de itens lidos // l primeiro valor // enquanto a entrada for boa e no eof // mais um item lido // acumula valores lidos // l prximo valor

if (arqEntrada.eof()) cout << "Fim de arquivo alcanado.\n"; else if (arqEntrada.fail()) cout << "Tipo incorreto de dado na entrada.\n"; else cout << "Entrada encerrada por razo desconhecida.\n";

Leitura de Arquivos Texto


if (cont == 0) cout << "Nenhum valor processado.\n"; else { cout << "Itens lidos: " << cont << endl; cout << "Soma: " << soma << endl; cout << "Mdia: " << soma / cont << endl; } arqEntrada.close(); system("pause"); return 0; } // fecha o arquivo

Leitura de Arquivos Texto


Arquivo "pontos.txt":
18 19 18.5 13.5 14 16 19.5 20 18 12 18.5 17.5

Sada do programa:
Digite nome do arquivo: pontos.txt Fim de arquivo alcanado. Itens lidos: 12 Soma: 204.5 Mdia: 17.0417

Modos de Abertura
Ao abrir um arquivo pode-se passar um

segundo argumento com o modo de abertura


arqEntrada.open("boliche.txt", ios_base::in);

O modo de abertura do arquivo descreve

como o arquivo ser usado:


Apenas escrita de dados Apenas leitura de dados Leitura e escrita de dados Juno de dados

Modos de Abertura
A tabela abaixo lista as constantes que

podem ser usadas para o modo de abertura:


Constante ios_base::in ios_base::out ios_base::ate ios_base::app ios_base::trunc Ios_base::binary Significado Abre arquivo para leitura Abre arquivo para escrita Vai pro fim do arquivo ao abr-lo Junta ao final do arquivo Limpa arquivo, se ele existir Arquivo binrio

Modos de Abertura
Omitindo o modo de abertura do arquivo faz

com que sejam usados os valores padro:


Ifstream
arqEntrada.open("boliche.txt", ios_base::in);

Ofstream
arqSaida.open("pesca.txt", ios_base::out | ios_base::trunc);

Para escrever dados sem apagar o arquivo:


ofstream arqSaida; arqSaida.open("append.txt", ios_base::out | ios_base::app);

Arquivos Binrio
So arquivos que guardam a informao em

sua representao binria (ex.: Word 2003)


Representao binria de 0.375
0 0111110 110000000000000000000000

sinal expoente

mantissa

Representao texto de 0.375


01101001 '0' 01101001 '.' 01101001 '3' 01101001 '7' 01101001 '5'

Arquivos Binrios
A entrada e sada de arquivos binrios

usualmente feita com o uso de registros


struct planeta { char nome[20]; double populacao; double gravidade; }; // nome do planeta // nmero de habitantes // acelerao da gravidade

planeta pl = {"Terra", 6820400000, 9.81};

Para salvar o registro num arquivo binrio:


ofstream fout; fout.open("planetas.dat", ios_base::out | ios_base::binary); fout.write( (char*) &pl, sizeof pl);

Arquivos Binrios
O mtodo write() copia uma quantidade de

bytes da memria para um arquivo


ofstream fout; fout.open("planetas.dat", ios_base::out | ios_base::binary); fout.write( (char*) &pl, sizeof pl);

A instruo vai para o endereo de pl e copia 36

bytes (o tamanho do registro pl) para o arquivo associado a fout (planetas.dat) A converso do endereo do registro para um ponteiro para char necessria para usar write()

Arquivos Binrios
Para recuperar a informao gravada no

arquivo preciso usar o mesmo resgistro


struct planeta { char nome[20]; double populacao; double gravidade; }; planeta nv; // nome do planeta // nmero de habitantes // acelerao da gravidade

Para ler o registro de um arquivo binrio:


ifstream fin; fin.open("planetas.dat", ios_base::in | ios_base::binary); fin.read( (char*) &nv, sizeof nv);

Arquivos Binrios
// entrada e sada em arquivos binrios #include <iostream> #include <fstream> using namespace std; struct planeta { char nome[20]; double populacao; double gravidade; }; int main() { planeta pl; ifstream fin; // cria objeto para leitura de arquivo fin.open("planetas.dat", ios_base::in | ios_base::binary); // continua

// nome do planeta // nmero de habitantes // acelerao da gravidade

Arquivos Binrios
if (fin.is_open()) // se o arquivo foi aberto sem erros { cout << "Aqui esta o contedo do arquivo:" << endl; while (fin.read((char *) &pl, sizeof pl)) { cout << pl.nome << " " << pl.populacao << " " << pl.gravidade << endl; } fin.close(); } // acrescenta mais dados ofstream fout; fout.open("planetas.dat", ios_base::out | ios_base::app | ios_base::binary); if (!fout.is_open()) { cout << "Arquivo no pode ser aberto!" << endl; exit(EXIT_FAILURE); } // continua

Arquivos Binrios
cout << "\nNome do planeta: "; cin >> pl.nome; cout << "Populacao: "; cin >> pl.populacao; cout << "Gravidade: "; cin >> pl.gravidade; fout.write((char *) &pl, sizeof pl); fout.close(); fin.open("planetas.dat", ios_base::in | ios_base::binary); if (fin.is_open()) { cout << "\nAqui esta o contedo do arquivo:" << endl; while (fin.read((char *) &pl, sizeof pl)) { cout << pl.nome << " " << pl.populacao << " " << pl.gravidade << endl; } fin.close(); } system("pause"); return 0; }

Arquivos Binrios
Sada do programa:
Aqui esta o conteudo do arquivo: Terra 6820400000 9.81 Marte 2 9.81 Venus 0 6.53 Mercurio 0 8.88

Nome do planeta: Plutao Populacao: 0 Gravidade: 3.10


Aqui esta o conteudo do arquivo: Terra 6820400000 9.81 Marte 2 9.81 Venus 0 6.53 Mercurio 0 8.88 Plutao 0 9.20

Concluso
Entrada e sada de dados em arquivos um

recurso muito utilizado em programas


Os dados podem ser armazenados em:
Arquivos texto: podem ser lidos por qualquer

editor de texto e so altamente portveis Arquivos binrios: so mais precisos para nmeros, as operaes de leitura e escrita so mais rpidas e geralmente ocupam menos espao