You are on page 1of 25

Aula 8: Manuseando Arquivos com C++

Arquivos
Definies Acesso a arquivos sequenciais Escrevendo e Lendo em Arquivos sequenciais Acesso a arquivos aleatrios Escrevendo, Lendo e Atualizando arquivos aleatrios

Projeto
Recomendaes

Definies
Stream sequncia de bytes C++ no impe nenhuma estrutura para um arquivo, ficando ao encargo do programador estrutur-lo Geralmente, so utilizados campos chave para identificao dos registros como, por exemplo, nmero da conta bancria de um indivduo

Exemplo de Cdigo em C Sequencial


#include <stdio.h> int main() { FILE * arquivo; char * texto; texto = (char*)malloc(sizeof(char) * 100); arquivo =fopen("c:\\Temp\\CarlosHenrique\\CursoC++\\Codigos\\teste.txt", "w"); // Abertura de Arquivos sprintf (texto, "Curso C++"); fprintf (arquivo, "%s", texto); fclose(arquivo); return 0; }

Exemplo de Cdigo em C++ Sequencial


#include <fstream.h> #include <string> using std::fout; using std::string; int main() { string texto; ofstream arquivo("c:\\Temp\\CarlosHenrique\\CursoC++\\Codigos\\teste.txt"); texto.assign("Curso C++"); arquivo << texto; arquivo.close(); return 0; }

Lista dos Modos de Abertura dos arquivos


Modo
ios::app ios::ate

Descrio
Grava toda sada no fim do arquivo. Abre um arquivo para sada e avana at o fim do arquivo (normalmente utilizado para acrescentar dados a um arquivo) Abre um arquivo para entrada Abre um arquivo para sada Elimina o contudo do arquivo, se ele existe Abre um arquivo para entrada ou sada binria

ios::in ios::out ios::trunc ios::binary

Lista de comandos Essenciais


Ofstream abrir arquivo/criar arquivo de dados Setw(tamanho) contador de espaos Setiosflags (ios::left) configurao e alinhamento Arquivo.close();

Exemplo: Escrevendo em arquivo sequencial Parte 1


#include <fstream> #include <string> using std::cerr; int main() { int contador; char nome[30]; double balanco; ofstream arquivo("c:\\Temp\\CarlosHenrique\\CursoC++\\Codigos\\teste.txt");

Exemplo: Escrevendo em arquivo sequencial Parte 2


if (!arquivo) { cerr << "Arquivo no pode ser aberto."; exit(1); } cout << "Digite a conta, o nome e o saldo.\n"; do // Inserindo dados at que o contador seja <0 ou >100 { cin >> contador >> nome >> balanco; arquivo << contador << ' ' << nome << ' ' << balanco << '\n'; cout << "? "; } while ((contador > 0) && (contador < 100));

Checando se o arquivo foi aberto corretamente

Exemplo: Escrevendo em arquivo sequencial Parte 3


arquivo.close(); return 0; }

Importante
Verificar se o arquivo abriu corretamente Analisar a forma de estruturao do arquivo de dados Fechar o arquivo de dados ao finalizar o uso

Lendo um Arquivo de Dados Parte 1


#include <fstream> #include <iostream> #include <iomanip> #include <stdlib.h> #include <string> using std::cerr; using std::resetiosflags; using std::setiosflags; using std::setprecision; using std::setw;

Lendo um Arquivo de Dados Parte 1


void Lendo (int contador, char * nome, double balanco) { cout << setiosflags(ios::left) << setw(10) << contador << setw (13) << nome << setw (7) << setprecision(2) << resetiosflags(ios::left) << balanco << '\n'; } int main() { int contador; char nome[30]; double balanco;

Lendo um Arquivo de Dados Parte 3


ifstream arquivo_saida("c:\\Temp\\CarlosHenrique\\CursoC++\\Codigos \\teste.txt", ios::in); if (!arquivo_saida) { cerr << "Arquivo de Saida no pode ser aberto."; exit(1); } cout << "Digite a conta, o nome e o saldo.\n"; cout << setiosflags(ios::left) << setw(10) << "Conta" << setw (13) << "Nome" << "Saldo \n" << setiosflags(ios::fixed | ios::showpoint); while (arquivo_saida >> contador >> nome >> balanco) Lendo(contador, nome, balanco); return 0; }

Arquivos de Acesso Aleatrio


Arquivos sequenciais so inadequados para as chamadas aplicaes de acesso instantneo, nas quais um registro de informao particular deve ser localizado imediatamente. Exemplo o processamento de transaes bancrias Os registros individuais de um arquivo de acesso aleatrio podem ser acessados diretamente (e rapidamente) sem pesquisar outros registros

Esquematizando
0 1000

Registros = 100 bytes

Comandos seekp e write


Seekp determina em que posio do arquivo deve ser realizada a tarefa (incluso, alterao ou excluso) Write Envia um nmero fixo de bytes comeando em uma posio especfica da memria para o stream de sada especificado.

Exemplo: Inserindo dados em Arquivos Aleatrios Parte 1


#include <iostream.h> using std::cerr; using std::cout; using std::cin; using std::ios; #include <fstream> using std::ofstream; struct EstCliente { int contador; char PrimeiroNome[15]; char UltimoNome[10]; double balanco; };

Exemplo: Inserindo dados em Arquivos Aleatrios Parte 2


int main() { EstCliente cliente; ofstream arquivo("Credito.dat", ios::binary); if (!arquivo) { cerr << "Arquivo no pode ser aberto."; exit(1); } cout << "Digite o nmero da conta << "( 1 a 100, 0 para terminara entrada) \n ?";

Exemplo: Inserindo dados em Arquivos Aleatrios Parte 3


cin >> cliente.contador; while (cliente.contador > 0 && cliente.contador <= 100) { cout << "Digite o Nome, Sobrenome e o saldo \n ?"; cin >> cliente.PrimeiroNome >> cliente.UltimoNome >> cliente.balanco; arquivo.seekp( (cliente.contador-1) * sizeof(EstCliente)); arquivo.write ( reinterpret_cast<const char*>(&cliente), sizeof(EstCliente) ); cout << "Digite nmero da conta \n ?"; cin >> cliente.contador; } return 0; }

Funo para Leitura Aleatria Parte 1


#include <iostream.h> using std::cerr; using std::cout; using std::cin; using std::ios; #include <fstream> using std::ifstream; #include <iomanip> using std::setprecision; using std::setiosflags; using std::resetiosflags; using std::setw;

Funo para Leitura Aleatria Parte 1


struct EstCliente { int contador; char PrimeiroNome[15]; char UltimoNome[10]; double balanco; }; void Lendo () { EstCliente cliente; int indice; ifstream arquivo_saida("c:\\Temp\\CarlosHenrique\\CursoC++\\Codigos\\Credito.dat", ios::in);;

Funo para Leitura Aleatria Parte 2


if (!arquivo_saida) { cerr << "Arquivo no pode ser aberto."; exit(1); } cout << "Informe o Codigo do Cliente: "; cin >> indice; cout << setiosflags(ios::left) << setw(10) << "Conta" << setw(11) << "Nome" << setw(16) << "Sobrenome" << resetiosflags(ios::left) << setw(10) << "Saldo \n";

Funo para Leitura Aleatria Parte 3


arquivo_saida.seekg((indice - 1) * sizeof(EstCliente)); arquivo_saida.read(reinterpret_cast<char *> (&cliente), sizeof(EstCliente)); cout << setiosflags(ios::left) << setw(10) << cliente.contador << setw(11) << cliente.PrimeiroNome << setw(16) << cliente.UltimoNome << setw(10) << setprecision(2) << resetiosflags(ios::left) << setiosflags (ios::fixed | ios::showpoint) << cliente.balanco << '\n'; }

Atualizando Arquivos Aleatrios Parte 1


void AtualizarNome() { EstCliente cliente; int conta_atualizar; fstream arquivo_atualizar("c:\\Temp\\CarlosHenrique\\CursoC++\\Codigos\\Credito.d at", ios::in|ios::out); cout << "Informe o numero da Conta a ser Atualizada: "; cin >> cliente.contador; arquivo_atualizar.seekg((cliente.contador - 1) * sizeof(EstCliente) ); arquivo_atualizar.read((&cliente), sizeof(EstCliente)); cout << "Informe o novo Nome: "; cin >> cliente.PrimeiroNome;

Atualizando Arquivos Aleatrios Parte 1


arquivo_atualizar.seekp((cliente.contador - 1) * sizeof(EstCliente) ); arquivo_atualizar.write(reinterpret_cast<const char*>(&cliente), sizeof(EstCliente)); arquivo_atualizar.close(); }

Projeto: Recomendaes
Trabalhar com arquivos Comear a trabalhar o quanto antes Enviar dvidas por e-mail

You might also like