Manipulação de Arquivos



Documentos relacionados
Módulo 2. Acesso a Arquivos. Métodos e Algoritmos Computacionais C++ (Rone Ilídio)

Fundamentos de Programação Linguagem C++ Entrada e saída com arquivos

C++ - Operações com arquivos

Introdução. Manipulação de arquivos em C. Estrutura de Dados II Prof Jairo Francisco de Souza

Manipulação de Arquivos

Estruturas de Dados. Profa. Juliana Pinheiro Campos

10. INPUT/OUTPUT (I/O)

INF 1005 Programação I

Componentes da linguagem C++

Armazenamento de Dados. Prof. Antonio Almeida de Barros Junior

Algoritmos e Programação _ Departamento de Informática

Curso de Linguagem C

Computação L2. Arquivos. Observação: Material da Disciplina Computação Eletrônica CIN/UFPE.

Aula 28: Arquivos de texto

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

INF 1005 Programação I

Estrutura de Dados Básica

Algoritmos e Programação Estruturada

struct LISTA item quant

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

INTRODUÇÃO À LINGUAGEM C++

14. Arquivos. W. Celes e J. L. Rangel. Estruturas de Dados PUC-Rio 13-1

Capítulo 2: Introdução à Linguagem C

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

1 Funções básicas de implementação de arquivos

Operações com Arquivos

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

5 -a. Manipulação de arquivos em C++

Algoritmos e Programação

Programação de Computadores I. Linguagem C Arquivos

MC-102 Algoritmos e Programação de Computadores

JSP - ORIENTADO A OBJETOS

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

Técnicas de Programação: ESTRUTURAS, UNIÕES E TIPOS DEE UFPB

Rotinas de Manipulação de Arquivos

Introdução à Programação

INF 1007 Programação II

Bacharelado em Ciência e Tecnologia BC Processamento da Informação Teoria Arquivos Prof. Edson Pinheiro Pimentel edson.pimentel@ufabc.edu.

Aula 1. // exemplo1.cpp /* Incluímos a biblioteca C++ padrão de entrada e saída */ #include <iostream>

Curso de C para Engenharias

Técnicas de Programação I

Lista de Exercícios da 3ª Unidade. ( Ponteiros, Alocação dinâmica, Arquivos, Estruturas de Dados)

INFORMÁTICA APLICADA AULA 02 LINGUAGEM DE PROGRAMAÇÃO C++

Strings. Todas as funções apresentadas neste documento estão no arquivo de cabeçalho string.h.

17 - Funções e Procedimentos em C Programação Modular

Trabalho 3: Agenda de Tarefas

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Introdução a Java. Hélder Nunes

SOP - TADS Sistemas de Arquivos Cap 4 Tanenmbaum

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

1) Ao ser executado o código abaixo, em PHP, qual será o resultado impresso em tela?

Roteiro do Programa e Entrada/Saída

Programando em C++ Histórico da Linguagem C

Introdução a Computação

Manipulação de Arquivos Binários

Arquivos. Estruturas de Dados II Vanessa Braganholo

V - Lista de Exercícios de SO e Lab. 1-) Escreva um programa em C para criar um arquivo texto, com informações fornecidas pelo usuário não formatadas.

Linguagens de Programação

Programação: Tipos, Variáveis e Expressões

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Computação 2. Aula 8. Profª. Fabiany Arquivos

Fundamentos de Programação II. Introdução à linguagem de programação C++

Pilhas. Profa Morganna Diniz

Persistência de Dados

MC-102 Aula 17 Strings e Matrizes

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

Noções sobre Objetos e Classes

Aula 1 Tipo Abstrato de Dados

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Faculdade de Ciências Universidade Agostinho Neto Departamento de Matemática e Engenharia Geográfica Ciências da Computação

Conceitos de Linguagens de Programação

Introdução a C Tipos de Dados Variáveis Operadores

Linguagem C. TGSI Lógica de Programação / Linguagem C Prof. Marcos Roberto

Resumo da Introdução de Prática de Programação com C. A Linguagem C

Centro de Computação - Unicamp Gerência de Atendimento ao Cliente ( apoio@turing.unicamp.br) Sumário

AULA 2: INTRODUÇÃO A LINGUAGEM DE C. Curso: Ciência da Computação Profª.: Luciana Balieiro Cosme

20 Caracteres - Tipo char

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Arquitetura de Computadores. Tipos de Instruções

Transcrição:

1 Manipulação de Arquivos Para realizar E/S em arquivo, você precisa incluir o arquivo-cabeçalho fstream.h nos programas. Esse arquivo define muitas classes e valores importantes. Abrindo e fechando um arquivo Em C++ um arquivo é aberto pela ligação de um fluxo. Existem três tipos de fluxo: entrada, saída e entrada/saída. Para abrir um fluxo de entrada, você deve declará-lo para ser da class ifstream. Para abrir um fluxo de saída, ele deve ser declarado como class ofstream. Fluxos que realizarão tanto operações de entrada como de saída devem ser declarados como da class fstream. Exemplo: esse exemplo cria um fluxo de entrada, um de saída e um fluxo capaz de realizar tanto entrada como saída: ifstream in; ofstream out; fstream both; // entrada // saída // entrada e saída Uma vez criado um fluxo, uma maneira de associá-lo a um arquivo é utilizando-se a função open(). Essa função é um membro de cada uma das três classes stream. Seu protótipo é mostrado a seguir. Protótipo da função open( ): void open( char *nome do arquivo, int modo, int acesso; Aqui, nome do arquivo é o nome do arquivo que pode incluir um especificador de caminho. O valor de modo determina como o arquivo é aberto. Esse valor deve ser um (ou mais) destes (definidos em fstream.h): ios::app Toda saída para um dado arquivo é acrescentada ao que já existe no arquivo. Só para arquivos que permitem escrita. ios::ate Ocorre uma busca pelo final do arquivo quando o arquivo é aberto. ios::in Especifica que o arquivo é capaz de realizar entrada (leitura). ios::nocreate Faz com que a função open() falhe se o arquivo não existir. ios::noreplace Faz com que a função open() falhe se o arquivo já existir. ios::out Especifica que o arquivo é capaz de realizar saída (escrita). ios::trunc Faz o conteúdo de um arquivo já existente com o mesmo nome ser destruído e o arquivo ser truncado com tamanho zero. O valor de acess determina como o arquivo pode ser acessado. Esse valor corresponde aos códigos de atributos de arquivo do DOS mostrados aqui: Atributo Significado 0 Arquivo normal - acesso aberto 1 Arquivo somente para leitura 2 Arquivo oculto (escondido) 4 Arquivo de sistema 8 Bit de arquivamento fixado Criar um fluxo usando o modo ifstream significa criar um arquivo de entrada e criar um fluxo usando-se ofstream implica criar um arquivo de saída. Por este motivo, ainda que seja inteiramente apropriado abrir um arquivo usando a função open(), na maioria das vezes, você não irá usá-la, já que as classes ifstream, ofstream e fstream têm funções construtoras que abrem um arquivo automaticamente.

2 Exemplo: abrindo um arquivo de entrada sem a função open(): ifstream minhastream ("myfile"); // abre arquivo para entrada if(!minhastream ) // erro no processo Para fechar um arquivo, use a função membro close( ). Exemplo: usando a função close() para fechar o arquivo ligado a um fluxo chamado minhastream: minhastream.close; Lendo e escrevendo arquivos-texto Ler ou escrever de um arquivo-texto é simples, já que se pode simplesmente usar os operadores >> e <<. Exemplo: programa que escreve um inteiro, um valor em ponto flutuante e uma string para um arquivo chamado Teste.txt: void main (void) // abre um arquivo para escrita de nome Teste.txt ofstream out( "Teste.txt" ); if(!out ) out << 10 << " " << 123.23 << endl; out << "Este é um pequeno arquivo-texto"; out.close(); Exemplo: programa que lê um inteiro, um valor em ponto flutuante e uma string do arquivo criado pelo programa anterior: void main (void) // declaração das variáveis char ch; // guarda o caractere lido int i; // guarda o inteiro lido float f; // guarda o número real lido char str[80]; // guarda a string lida // abre um arquivo para leitura de nome Teste.txt ifstream in( "Teste.txt" ); if(!in ) in >> i; in >> f; in >> ch; in >> str; cout << i << " " << f << " " << ch << endl; cout << str;

3 E/S Binárias Existem duas maneiras de se ler e escrever dados binários de e para um arquivo. Primeiro, pode-se escrever um byte usando-se a função membro put( ) e ler um byte com a função membro get( ). A função get( ) tem muitas formas, mas a versão mais usada é mostrada aqui. Protótipos das funções get( ) e put( ): istream &get( char &ch ); ostream &put( char &ch ) A função get() lê um único caracter do fluxo associado, coloca o valor em ch e retorna o fluxo. A função put() escreve ch para o fluxo e retorna o fluxo. Exemplo: programa que exibe o conteúdo de um arquivo na tela, usando a função get(). void main ( int argc, char *argv[] ) // declaração das variáveis char ch; // guarda o caractere lido if( argc!= 2 ) cout << "Use: programa <nome do arquivo>" << endl; // abre um arquivo para leitura ifstream in( argv[1] ); if(!in ) while( in ) // in será zero quando eof (fim do arquivo) for encontrado in.get( ch ); cout << ch; Exemplo: programa que escreve uma string para um arquivo, usando a função put( ): void main ( void ) char *p = "Alô a todos!"; // abre um arquivo para escrita ofstream out( "Test.txt" ); if(!out )

4 while( *p ) out.put( *p++ ); Detectando o EOF (Final do Arquivo) Pode-se saber quando o final de um arquivo é encontrado usando-se a função membro eof( ), que tem o protótipo a seguir: Protótipo da função eof( ): int eof( ); Ela retorna não zero quando o fim do arquivo é encontrado; caso contrário, retorna zero. Acesso Randômico No sistema de E/S do C++ é possível realizar acesso randômico usando-se as funções seekg( ) e seekp( ). As formas mais comuns dessas funções são mostradas abaixo. Protótipo das funções seekg() e seekp(): istream &seekg( streamoff offset, seek_dir origin ); ostream &seekp( streamoff offset, seek_dir origin ); Aqui, streamoff é um tipo definido em iostream.h capaz de conter o maior valor válido suportado por offset, seek_dir é uma enumeração que pode ter estes valores: ios::beg ios::cur ios::end Começo do arquivo Localização corrente Final do arquivo A função seek_g() move o ponteiro get (ponteiro de leitura), offset número de bytes a partir da origem especificada, que deve ter um dos três valores acima. A função seek_p() move o ponteiro put (ponteiro de escrita), offset número de bytes a partir da origem especificada, que deve ter um dos três valores acima. Exemplo: esse programa permite que seja especificado um nome de arquivo na linha de comando seguido pelo byte específico no arquivo que se deseja alterar. Então, escreve um "X" na localização especificada (usa a função seek_p()): #include <stdlib.h> void main ( int argc, char *argv[] ) if( argc!= 3) cout << "Use: programa <nome do arquivo> <byte>" << endl; // abre um arquivo para escrita ofstream out( argv[1] ); if(!out ) out.seekp( atoi( argv[2] ), ios::beg ); out.put( 'X' );

5 out.close(); Exemplo: esse programa usa a função seek_g() para exibir o conteúdo do arquivo, começando na localização especificada: #include <stdlib.h> void main ( int argc, char *argv[] ) char ch; // armazena caracter lido if( argc!= 3) cout << "Use: programa <nome do arquivo> <byte>" << endl; // abre um arquivo para leitura ifstream in( argv[1] ); if(!in ) in.seekg( atoi( argv[2] ), ios::beg ); while( in.get( ch )) cout << ch; Lista de Programas 1. Programa Contale1.cpp // Programa: contale1.cpp // O Diálogo: Programa para contar a ocorrência de cada uma das letras // A, B,..., Z (ou suas minúsculas equivalentes a, b,..., z) em um arquivo // de texto. O vetor Frequencia indexado pelas letras A,..., Z é usado para // isto. Se Caracter é uma das 26 letras, Frequencia[Caracter] é o número de // ocorrências de Caracter na linha do texto. // Declaração das bibliotecas utilizadas #include<iostream.h> // cin, cout #include<fstream.h> // ifstream #include<stdlib.h> // exit #include<ctype.h> // toupper // Declaração das constantes globais const unsigned int TAMMAX = 40; // Declaração dos Tipos typedef char string[50]; typedef enuma,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z Letra; typedef unsigned int VetorContaCar[26]; // Início da função principal void main(void) VetorContaCar Frequencia; // Freqüência das Letras ifstream ArquivoIn; ofstream ArquivoOut;

6 // declaração das funções. void AbreArq(ifstream &, ofstream &); void Inicializa(VetorContaCar); void LeDados(VetorContaCar, ifstream &); void ImprimeVetor(const VetorContaCar, ofstream&); void FechaArq(ifstream &, ofstream &); // Passo 1. Abra os arquivos AbreArq(ArquivoIn, ArquivoOut); // Passo 2. Inicialize o vetor Freqüência Inicializa(Frequencia); // Passo 3. Leia a Entrada LeDados(Frequencia, ArquivoIn); // Passo 4. Imprimir os resultados (vetor Frequencia) ImprimeVetor(Frequencia, ArquivoOut); // Passo 5. Feche o arquivo FechaArq(ArquivoIn, ArquivoOut); // Fim da função principal // implementação das funções // Função: AbreArq // O Diálogo: Esta função abre um arquivo para leitura. void AbreArq(ifstream &ArquivoIn, ofstream &ArquivoOut) string NomeArquivoIn, NomeArquivoOut; // Leia o nome do arquivo de entrada cout << endl << "Entre com o nome do arquivo de entrada" << endl; cin.getline(nomearquivoin, TAMMAX); // Leia o nome do arquivo de saída cout << endl << "Entre com o nome do arquivo de saída" << endl; cin.getline(nomearquivoout, TAMMAX); // Abra o arquivo para leitura ArquivoIn.open(NomeArquivoIn, ios::in); // Abra o arquivo para escrita ArquivoOut.open(NomeArquivoOut, ios::out); // Verifique se o arquivo de entrada foi aberto com sucesso if (!ArquivoIn) cerr << endl << "Arquivo de entrada não pode ser aberto" << endl; exit(1); // Verifique se o arquivo de saída foi aberto com sucesso if (!ArquivoOut) cerr << endl << "Arquivo de entrada não pode ser aberto" << endl; exit(1); // fim da função AbreArq // Função: Inicializa // O Diálogo: Esta função inicializa o vetor Freqüencia que armazenará as // freqüências dos caracteres no arquivo void Inicializa(VetorContaCar Frequencia) Letra Ch;

7 for (Ch=A; Ch <=Z; Ch = (Letra)(Ch+1)) // Atribua 0 para a freqüência da i-ésima letra Frequencia[Ch] = 0; // fim da função inicializa // Função: LeDados // O Diálogo: Esta função le os dados de uma arquivo, conta a ocorrência dos // caracteres no arquivo e armazena no vetor Frequencia void LeDados(VetorContaCar Frequencia, ifstream &ArquivoIn) char Caracter; // Enquanto não chegar no final do arquivo leia os caracteres while(arquivoin.get(caracter)) // Transforme todos os caracteres para maiúsculas Caracter = toupper(caracter); // Verifique se o caracter está entre A e Z if ((Caracter >= 'A') && (Caracter <= 'Z')) // Caso verdadeiro incremente a freqüencia do caracter Frequencia[int(Caracter)-65]++; // fim da função LeDados // Função: ImprimeVetor // O Diálogo: Esta função imprime um vetor void ImprimeVetor(const VetorContaCar Frequencia, ofstream &ArquivoOut) Letra Ch; // Imprima o cabeçalho ArquivoOut << "No texto computado, as letras A - Z ocorreram com a seguinte freqüência: " << endl; for (Ch = A; Ch <= Z; Ch = (Letra)(Ch+1)) // Imprima a freqüência do i-ésimo caracter ArquivoOut << "Freqüência de " << char(ch+65) << ": " << Frequencia[Ch] << endl; // fim da função ImprimeVetor // Função: FechaArq // O Diálogo: Esta função fecha um arquivo void FechaArq(ifstream &ArqIn, ofstream &ArqOut) // Feche o arquivo de entrada ArqIn.close(); // Feche o arquivo de saída ArqOut.close(); // fim da função FechaArq Exercício: Crie um arquivo A, com registros com campos de NOME e SALARIO. Depois crie um arquivo B, através da cópia dos registros de A.