SSC 301 - INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL REGISTROS E ARQUIVOS Profa. Dra. Milena Guessi Margarido (milena@icmc.usp.br)
Número Bairro CEP Cidade Logradouro Endereço País
REGISTRO Estrutura composta heterogênea Exemplo endereço: Logradouro: literal CEP: numérico Número: numérico Bairro: literal Cidade: literal Estado: literal País: literal
REGISTRO Um registro (struct) é uma coleção de dados (que podem ser de tipos diferentes) sobre um objeto particular. registro campo cada campo pode ser de qualquer tipo
REGISTRO - EXEMPLO Cadeia de Caracteres Vetor de Reais Matriz de Reais Real Nome CPF RG HT 1 HT 2 HT 3 HT 4 HT 5 HT 6 Salário FGTS 1.1 FGTS 1.2 FGTS 2.1 FGTS 2.2 horas trabalhadas no semestre FGTS nos trimestres
REGISTRO Cada campo deve ter um nome e deve ser referenciado por este nome Não confundir com matriz e vetor onde todos os elementos são do mesmo tipo e são referenciados por um índice
COMO DEFINIR UMA VARIÁVEL DE TIPO REGISTRO EM C typedef struct { Descrição dos campos tipo1 campo_1; tipo2 campo_2;... } nome_do_registro; tipon campo_n; Não é uma variável, é um novo tipo de dado!
ONDE DEFINIR UMA VARIÁVEL DE TIPO REGISTRO EM C No início do programa (em geral, fora de todas as funções): typedef struct { char logradouro[50]; char cep; int numero; char bairro[30]; char cidade[30]; char estado[2]; char pais[20]; } REGENDERECO; Uma vez definida, pode-se referenciar o novo tipo para declarar variáveis usando: REGENDERECO ENDERECO;
FAZENDO REFERÊNCIA A UM CAMPO DE VARIÁVEL DO TIPO REGISTRO EM C <nome-da-variável-tipo-struct>.<nome do campo> No exemplo anterior, uma atribuição de valores poderia ser: ENDERECO.logradouro = Av Trabalhador São-carlense ; ENDERECO.cep = 13566-590 ; ENDERECO.numero = 400; ENDERECO.estado = SP ; ENDERECO.bairro = Centro ; ENDERECO.pais = Brasil ; ENDERECO.cidade = São Carlos ;
FAZENDO REFERÊNCIA A UM CAMPO DE VARIÁVEL DO TIPO REGISTRO EM C No exemplo anterior, uma leitura de valores poderia ser: printf("\n\nentre com o logradouro:"); gets(endereco.logradouro); printf("\n\nentre com o cep:"); gets(endereco.cep); printf("\n\nentre com o número:"); scanf( %d, &ENDERECO.numero);
MANIPULAÇÃO DA VARIÁVEL DE TIPO REGISTRO EM C As variáveis do tipo struct podem ser manipuladas do mesmo modo que outros dados na memória Exemplo: SALARIO_BR = CONV_USD_REAL * REGEMPREGADO.SALARIO_USD;
EXIBIÇÃO DA VARIÁVEL DE TIPO REGISTRO EM C As variáveis do tipo struct podem ser exibidas. Exemplo: printf ( cidade: %s, ENDERECO.cidade);
VETOR DE REGISTROS Se, ao invés de um única ficha do empregado, quisermos cadastrar várias fichas? Solução: criar um vetor de registros HT 1 HT 1 HT 1 CPF Nome CPF Nome Nome RG Salário RG HT 2 HT 3 HT 4 HT 5 HT 6 HT 2 HT 3 HT 4 HT 5 HT 6 CPF FGTS 1.1 RG FGTS 1.2 HT 2 HT 3 Salário FGTS HT 2.1 4 HT 5 HT 6FGTS 2.2 FGTS 1.1 FGTS 1.2 Salário FGTS 2.1 FGTS 2.2 FGTS 1.1 FGTS 1.2 FGTS 2.1 FGTS 2.2
VETOR DE REGISTROS [0] [1] [2] HT 1 HT 1 HT 1 HT 1 HT 2 HT 3 HT 4 HT 5 CPF Nome FGTS 1.1 RG FGTS 2.1 FGTS 1.1 Salário FGTS 2.1 FGTS 1.1 FGTS 1.2 HT 2 HT 3 HT 4 HT 5 HT 6 FGTS 2.1 FGTS 2.2 HT 1 HT 2 HT 3 HT 4 HT 5 CPF HT 1 HT 2 HT 3 HT 4 HT 5 CPF Nome FGTS 1.1 RG FGTS 2.1 FGTS 1.1 Salário FGTS 2.1 FGTS 1.1 FGTS 1.2 HT 2 HT 3 HT 4 HT 5 HT 6 FGTS 2.1 FGTS 2.2 Nome FGTS 1.1 RG FGTS 2.1 FGTS 1.1 Salário FGTS 2.1 FGTS 1.1 FGTS 1.2 HT 2 HT 3 HT 4 HT 5 HT 6 FGTS 2.1 FGTS 2.2
COMO DEFINIR UM VETOR DE REGISTROS? Na seção de declaração de tipo coloca-se: typedef struct { tipo1 campo1; tipo2 campo2;... tipon campon; } nome_do_registro; nome_do_registro nome_da_variavel [dimensao];
EXEMPLO typedef struct { char logradouro[50]; char cep; int numero; char bairro[30]; char cidade[30]; char estado[2]; char pais[20]; } REGENDERECO; logradouro cep numero bairro cidade estado pais REGENDERECO campus[5];
VETOR DE REGISTROS Como referenciar este campo? [0] campus logradouro cep numero bairro cidade estado pais [1] logradouro cep numero bairro [2] cidade estado pais logradouro cep numero bairro cidade estado pais campus[0]. logradouro Como referenciar este campo? campus[1]. numero Como referenciar este campo? campus[2]. cidade
COMANDOS DE E/S
FUNÇÕES PARA E/S getchar() putchar() gets() puts() printf() scanf() Lê um caractere do teclado Escreve um caractere na tela Lê uma string (vetor de caracteres) do teclado Escreve uma string na tela seguido por uma nova linha Escreve dados na tela Lê dados do teclado Obs: Diferente de printf, puts pode escrever apenas strings de caractere, ou seja, não pode escrever números ou fazer conversões de formato
EXEMPLO #include <stdio.h> #include <string.h> biblioteca com funções sobre caracteres void main() { char str[80]; gets(str); printf( o comprimento é %d, strlen(str)); } O que esse programa faz?? Lê uma string para o vetor str e escreve seu comprimento
EXEMPLO - ALTERNATIVA #include <stdio.h> #include <string.h> biblioteca com funções sobre caracteres void main() { char str[80]; scanf( %s, str); printf( o comprimento é %d, strlen(str)); } O que esse programa faz?? Lê uma string para o vetor str e escreve seu comprimento
ATÉ AGORA... As estruturas são armazenadas na memória principal do computador Nem sempre é conveniente... Informação é perdida A quantidade de informação que pode ser armazenada para resolver o problema na memória principal é limitada
ARQUIVO Um arquivo é armazenado em um dispositivo de memória secundária Pode-se ler e guardar (escrever) dados em um arquivo Permite manter algumas informações para uso posterior Exemplo: cadastro de alunos, cadastro de vendas de uma empresa,
4 EXEMPLOS Arquivo de inteiros 1 56 0 23 Arquivo de reais 21.5-2.67 3.75 0.6 Arquivo de vetores de tamanho 4 composto por inteiros ( 1, 23, -12, 4) (56, 0, 65, 2) ( 0, 41, -7, 60) Arquivo de cadeia de caracteres Representação Simbólica Casa Lua Giz Rio
5 EXEMPLOS Arquivo de Registros HT 1 Nome CPF FGTS 1.1 FGTS 2.1 RG FGTS 1.1 Salário FGTS 2.1 FGTS 1.1 FGTS 1.2 HT 1 HT 2 HT 3 HT 4 HT 5 HT 2 HT 3 HT 4 HT 5 HT 6 FGTS 2.1 FGTS 2.2 HT 1 Nome CPF FGTS 1.1 FGTS 2.1 RG FGTS 1.1 Salário FGTS 2.1 FGTS 1.1 FGTS 1.2 HT 1 HT 2 HT 3 HT 4 HT 5 HT 2 HT 3 HT 4 HT 5 HT 6 FGTS 2.1 FGTS 2.2 Representação Simbólica HT 1 Nome CPF FGTS 1.1 FGTS 2.1 RG FGTS 1.1 Salário FGTS 2.1 FGTS 1.1 FGTS 1.2 HT 1 HT 2 HT 3 HT 4 HT 5 HT 2 HT 3 HT 4 HT 5 HT 6 FGTS 2.1 FGTS 2.2
COMPARAÇÃO Vetores/Matrizes Armazenam pequena quantidade de informação Ao término do programa, todas as informações armazenadas são perdidas Restrito as definições da linguagem de programação Tamanho da variável deve ser definida antes do uso Arquivo Armazenam grandes quantidades de informações Mantém informações armazenadas na memória secundária Variável do tipo file é um tipo de dado que existe independentemente de qualquer programa e pode ser acessado por outros programas Depende do espaço disponível do disco;
7 MANIPULAÇÃO DE ARQUIVOS Funções em C para arquivos fopen(), fclose(), ferror(), fputc(), fgetc(), fputs(), fgets(), fwrite(), fread(), fseek(), feof(), rewind() Biblioteca stdlib.h
8 CRIAR OU ABRIR ARQUIVO Definição de variável do tipo arquivo: FILE *arq; arq é uma variável que é capaz de identificar (apontar) para um arquivo no disco.
9 CRIAR OU ABRIR ARQUIVO Definição de variável do tipo arquivo: Função fopen(): abre ou cria um arquivo, retornando o ponteiro apontado para o mesmo. FILE *arq; arq = fopen(nome_arquivo, modo_abertura)
0 CRIAR OU ABRIR ARQUIVO Função fopen(): abre ou cria um arquivo, retornando o ponteiro apontado para o mesmo. arq = fopen(nome_arquivo, modo_abertura) nome_arquivo: string contendo o nome do arquivo para abrir ou criar, podendo incluir um path modo_abertura: string que representa como o arquivo será aberto: escrita, leitura...
CRIAR OU ABRIR ARQUIVO arq = fopen(nome_arquivo, modo_abertura) w r a wb rb ab Cria um arquivo texto para operações de escrita (apaga se ele já existir) Abre um arquivo texto para operações de leitura Abre um arquivo texto para anexar novos dados (no final) Cria um arquivo binário para operações de escrita (apaga se ele já existir) Abre um arquivo binário para operações de leitura Abre um arquivo binário para anexar novos dados (no final)
CRIAR OU ABRIR ARQUIVO w+ Cria um arquivo texto para operações de escrita e leitura (apaga se o arquivo já existir) r+ Abre um arquivo texto para operações de leitura e escrita (o arquivo deve existir) a+ Anexa novos dados ou cria um arquivo texto para operações de leitura e escrita (se o arquivo não existir, cria o arquivo) wb+ rb+ ab+ Cria um arquivo binário para operações de escrita e leitura (apaga se o arquivo já existir) Abre um arquivo binário para operações de leitura e escrita (o arquivo deve existir) Anexa novos dados ou cria um arquivo binário para operações de leitura e escrita (se o arquivo não existir, cria o arquivo)
3 CRIAR OU ABRIR ARQUIVO Exemplo: FILE *arq1, *arq2; arq1 = fopen( arquivo1.txt, w ); arq2 = fopen( texto.txt, a+ );
4 CRIAR OU ABRIR ARQUIVO Importante verificar se o arquivo foi criado ou aberto com sucesso! FILE *arq1, *arq2; arq1 = fopen( arquivo1.txt, w ); if (arq1==null) { printf( Erro na criação do arquivo); getch(); return(0); } else {...}
5 FECHAR ARQUIVO Função fclose(): fecha um arquivo. É importante que todo arquivo aberto seja fechado antes de terminar o programa. int fclose(arq); arq: ponteiro para um arquivo obtido pela função fopen()
6 ARQUIVO - MODO TEXTO Gravação e Leitura: função fputs(): escreve uma cadeia de caracteres em um arquivo fputs(cadeia_caracteres, arq) função fgets(): lê uma cadeia de caracteres de um arquivo até tam ou até encontrar LF fgets(cadeia_caracteres, tam, arq)
7 ARQUIVO - MODO TEXTO #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *arq; char texto[80]; arq = fopen("arquivo.txt", "a+"); if (arq == NULL) { printf("erro na abertura do arquivo\n"); return(0); } else { printf("grava linha a linha no arquivo\n"); printf("digite um texto ou <enter> para sair...\n"); gets(texto); while (strlen(texto) > 0) { fputs(texto, arq); fputs("\n", arq); gets(texto); } fclose(arq); } system("pause"); return 0; } O que faz esse programa??
8 ARQUIVO - MODO TEXTO #include <stdio.h> #include <stdlib.h> #include <string.h> //Gravar linhas em arquivo texto int main(int argc, char *argv[]) { FILE *arq; char texto[80]; arq = fopen("arquivo.txt", "r"); //w, a, r if (arq == NULL) { printf("arquivo nao encontrado...\n"); return(0); } else { printf("arquivo aberto com sucesso!! \n"); printf("leitura do arquivo\n"); O que faz esse programa?? while (fgets(texto, 80, arq)!= NULL) { printf("%s", texto); getch(); } fclose(arq); } system("pause"); return 0; }
9 ARQUIVO - MODO BINÁRIO Gravação: função fwrite(): escreve qualquer tipo de dados em um arquivo fwrite(&estrutura, tamanho, qtde, arq) Exemplos: fwrite(&agenda, sizeof(agenda), 1, arq) fwrite(&x, sizeof(int), 1, arq)
0 ARQUIVO - MODO BINÁRIO Leitura: função fread(): lê qualquer tipo de dados em um arquivo fread(&estrutura, tamanho, qtde, arq) Exemplos: fread(&agenda, sizeof(agenda), 1, arq) fread(&x, sizeof(int), 1, arq)
1 ARQUIVO - MODO BINÁRIO #include <stdio.h> #include <string.h> typedef struct { int placa; char nome[30]; char tipo[15]; } REG1; int main() { FILE *fptr = NULL, *fptr1=null; int op; do { printf("\t\tprograma Exemplo para Manipulacao de Arquivos\n\n"); printf("\t1 - Ler arquivo\n"); printf("\t2 - Gravar arquivo\n"); printf("\t3 - Sair do programa\n"); scanf("%d", &op); switch (op) { case 1: ler_arq(fptr); break; case 2: grava_arq(fptr); break; case 3: return(0); break; default: break; } } while (op!= 3); }
ARQUIVO - MODO BINÁRIO int grava_arq(file *fptr) { char conf; REG1 carro; if ((fptr = fopen("carro.arq", "ab+")) == NULL) { printf("nao posso abrir o arquivo\n"); getchar(); return(0); } fflush(stdin); printf(" \t\t Cadastro de Dados no Arquivo\n\n" ); printf("digite a placa do carro ou 0 para sair: "); scanf("%d", &carro.placa); while(carro.placa!= 0) { printf("proprietario= "); fflush(stdin); gets(carro.nome); printf("tipo= "); gets(carro.tipo); printf("confirma informacoes (S/N)?"); fflush(stdin); scanf("%c", &conf); if (conf == 's') fwrite(&carro, sizeof(carro), 1, fptr); fflush(stdin); printf("digite a placa do carro ou 0 para sair: "); scanf("%d", &carro.placa); } fclose(fptr); return(0); }
ARQUIVO - MODO BINÁRIO int ler_arq(file *fptr) { REG1 carro; if ((fptr = fopen("carro.arq", "rb")) == NULL) { printf("arquivo nao existente...\n"); getch(); return(0); } printf ("\t\tvisualizando informacoes do Arquivo...\n\n\n"); } while(fread(&carro, sizeof(carro),1,fptr) == 1) { printf("placa = %d\n",carro.placa); printf("proprietario = %s\n", carro.nome); printf("tipo = %s\n\n", carro.tipo); getch(); } fclose(fptr); return(0);