Escolar Documentos
Profissional Documentos
Cultura Documentos
MANIPULAO DE ARQUIVOS
Introduo
Frequentemente no computador a entrada
Introduo
As vezes a entrada de dados pelo teclado no
a melhor opo:
Imagine usar o teclado para entrar com nome,
Entrada Programa
Introduo
As vezes a sada de dados pelo teclado no
a melhor opo:
Seria conveniente gerar uma lista de compras de
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
em algum dispositivo
Introduo
O sistema operacional se encarrega de:
Gerenciar os arquivos Saber a localizao dos arquivos Guardar informaes como tamanho, data de
Introduo
Para um programador os arquivos se dividem
em duas categorias:
Arquivos texto: uma sequncia de bits em que um
'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
Introduo
A entrada e sada de arquivos em C++ muito
Arquivo
Entrada
Programa
Sada
Arquivo
Entrada e Sada
Quando utiliza-se cin para ler dados, o
'3'
'8'
'.'
'5'
' '
'1'
'9'
'.'
'2'
'\n'
Entrada e Sada
Cada byte interpretado como um cdigo de
'3'
'8'
'.'
'5'
' '
'1'
'9'
'.'
'2'
'\n'
Entrada e Sada
Entrada usando uma varivel tipo char:
38.5 19.2
'3'
'8'
'.'
'5'
' '
'1'
'9'
'.'
'2'
'\n'
00110011
ch
Entrada e Sada
Entrada usando uma varivel tipo int:
38.5 19.2
'3'
'8'
'.'
'5'
' '
'1'
'9'
'.'
'2'
'\n'
'3'
'8'
Entrada e Sada
Entrada usando uma varivel tipo float:
38.5 19.2
'3'
'8'
'.'
'5'
' '
'1'
'9'
'.'
'2'
'\n'
'3'
'8'
'.'
'5' =
38.5
Entrada e Sada
Entrada usando um vetor de caracteres:
38.5 19.2
'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
'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
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.
// ou
using std::cout;
disco usando a funo open() Usar o operador de insero << com o objeto ofstream Fechar o arquivo com a funo close()
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;
Arquivo carinfo.txt:
Marca e modelo: Ford Ka Ano: 2009 Preo normal: R$28576.00 Preo promocional: R$26089.89
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()
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); }
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); }
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";
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
Modos de Abertura
A tabela abaixo lista as constantes que
Modos de Abertura
Omitindo o modo de abertura do arquivo faz
Ofstream
arqSaida.open("pesca.txt", ios_base::out | ios_base::trunc);
Arquivos Binrio
So arquivos que guardam a informao em
sinal expoente
mantissa
Arquivos Binrios
A entrada e sada de arquivos binrios
Arquivos Binrios
O mtodo write() copia uma quantidade de
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
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
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
Concluso
Entrada e sada de dados em arquivos um
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