Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laboratório de Programação Operações com arquivos - Parte I Arquivos Texto em C Prof. Daniel Vecchiato daniel@ic.ufmt.br quarta-feira, 13 de março de 2013 Conteúdo Abordado • Tipo de dados; • Algoritmos em C e Pascal; • Estruturas de controle; • Estruturas de repetição; • Variáveis compostas homogêneas; • Variáveis compostas heterogêneas; • Modularização: Blocos e Subprogramas; • Parâmetros e formas de passagem; • Recursividade. quarta-feira, 13 de março de 2013 Conteúdo a ser abordado • Operações com arquivos; • Variáveis dinâmicas; • Abstração de dados; • Estruturas de dados dinâmicas: listas lineares; • Métodos simples de ordenação e pesquisa de dados. quarta-feira, 13 de março de 2013 Avaliação • Média = ((Nota 1 + Nota 2)/2 + Trab.)/2 quarta-feira, 13 de março de 2013 Agenda • Tipos de memória; • Nomes e extensões; • Tipos de arquivos; • Abrindo arquivo em C; • Lendo arquivo em C; • Escrevendo arquivo em C; • Resumo. quarta-feira, 13 de março de 2013 Tipos de Memória • Quando se estuda organização básica de um sistema computacional vemos que ela é formada por: quarta-feira, 13 de março de 2013 Tipos de Memória • A memória principal (Random Access Memory) utilizada na maioria dos computadores, usa uma tecnologia que requer alimentação constante de energia para que informações sejam preservadas. quarta-feira, 13 de março de 2013 Tipos de Memória • A memória secundária (como HD) utilizada na maioria dos computadores, usa uma tecnologia que NÃO requer alimentação constante de energia para que informações sejam preservadas. quarta-feira, 13 de março de 2013 Tipos de Memória • Todos os programas executam na RAM, e por isso, quando o programa termina ou acaba energia, as informações são perdidas. • Para podermos gravar estas informações de forma persistente, devemos escrevê-las em arquivos na memória secundária. quarta-feira, 13 de março de 2013 Tipos de Memória • A memória secundária possui algumas características: • É mais lenta do que a RAM; • É mais barata do que a RAM; • Possui maior capacidade de armazenamento. • Sempre que nos referimos a um arquivo, estamos falando de informações armazenadas na memória secundária. quarta-feira, 13 de março de 2013 Nomes e Extensões • Arquivos são identificados por um nome. • O nome de um arquivo pode conter sua extensão que indica o conteúdo do arquivo. arq.txt arquivo de texto arq.c código fonte em C arq.pdf portable document format arq.html arquivo de páginas WWW arq.exe arquivo executável (Windows) quarta-feira, 13 de março de 2013 Tipos de Arquivos • Arquivos podem ter o mais variado conteúdo, mas do ponto de vista dos programas existem dois tipos de arquivos: • Arquivo Texto; • Arquivo Binário. quarta-feira, 13 de março de 2013 Tipos de Arquivos • Arquivos Texto: • Armazena caracteres que podem ser mostrados diretamente na tela ou modificados por um editor de texto simples. • Exemplos: Código Fonte, páginas HTML. quarta-feira, 13 de março de 2013 Tipos de Arquivos • Arquivo Binário: • Sequência de bits sujeita a convenções dos programas que a gerou, não legíveis diretamente. • Exemplo: Arquivos executáveis, compactados, documentos do Word. quarta-feira, 13 de março de 2013 Diretório • Também conhecido como “pasta”. • Contém arquivos e/ou outros diretórios. quarta-feira, 13 de março de 2013 Caminhos absolutos/ relativos • O nome de um arquivo pode conter o seu diretório, ou seja, o caminho para encontrar este arquivo a partir da raiz. quarta-feira, 13 de março de 2013 Importância dos arquivos • Persistir os dados; • Salvar estado do programa; • Podem armazenar grande quantidade de informação; • Troca de informação entre programas; • Otimizar o uso da memória. quarta-feira, 13 de março de 2013 Fonte: Vida de Programador, 2011. http://vidadeprogramador.com.br/2011/09/08/so-um-arquivo-texto/ quarta-feira, 13 de março de 2013 Arquivo texto em C • Em C, para se trabalhar com arquivos devemos criar um ponteiro especial: um ponteiro para arquivos. • O comando acima cria um ponteiro para arquivos cujo o nome da variável é o nome especificado. FILE *nome_variavel; quarta-feira, 13 de março de 2013 Arquivo texto em C • Após ser criado um ponteiro para o arquivo, podemos associá-lo com um arquivo real do computador usando a função fopen. FILE *arq1; arq1 = fopen(“teste.txt”, “r”); quarta-feira, 13 de março de 2013 Arquivo texto em C • O primeiro parâmetro para fopen é uma string com o nome do arquivo: • Pode ser absoluto, por exemplo: • “/user/daniel/teste.txt” • Pode ser relativo, por exemplo: • “teste.txt” • O segundo parâmetro é uma string informando como o arquivo será aberto: • Para leitura ou gravação de dados ou ambos; • Se é texto ou binário. quarta-feira, 13 de março de 2013 Arquivo texto em C • Antes de acessar um arquivo, devemos abrí- lo com com a função fopen(). • A função retorna um ponteiro para o arquivo em caso de sucesso, e em caso de erro a função retorna NULL. quarta-feira, 13 de março de 2013 • Para ler dados do arquivo aberto, usamos a função fscanf(). • A única diferença para o scanf, é que devemos passar por parâmetro um ponteiro para o arquivo de onde será feita a leitura. Lendo dados de um arquivo texto int fscanf(ponteiro para arquivo, string de formato, variáveis); quarta-feira, 13 de março de 2013 Lendo dados de um arquivo texto • Quando um arquivo é aberto, um indicador de posição no arquivo é criado, e este recebe a posição do início do arquivo. • Para cada dado lido do arquivo, este indicador de posição é automaticamente incrementado para o próximo dado não lido. • Eventualmente o indicador de posição chega ao fim do arquivo: • A função fscanf devolve um valor especial, EOF, caso tente-se ler dados e o indicador de posição está no fim do arquivo. quarta-feira, 13 de março de 2013 Lendo dados de um arquivo texto • Para ler todos os dados de um arquivo texto, basta usarmos um laço que será executado enquanto não chegarmos no fim do arquivo: • O comando fclose deve ser sempre usado para fechar um arquivo que foi aberto. • Quando escrevemos dados em um arquivo, este comando garante que os dados serão efetivamente escritos no arquivo. quarta-feira, 13 de março de 2013 Exercício • Faça um programa que: • Peça ao usuário o nome de um arquivo. • Imprima na tela as informações contidas no arquivo. quarta-feira, 13 de março de 2013 quarta-feira, 13 de março de 2013 Pergunta! • Se ao realizar a leitura de um caracter o indicador de posição se move automaticamente, ao chegar no EOF como podemos ler o arquivo novamente do início? quarta-feira, 13 de março de 2013 Resposta! • Podemos abri-lo e fechá-lo novamente. • Usar o comando rewind(); quarta-feira, 13 de março de 2013 Escrevendo dados em um arquivo texto • Para escrever em um arquivo, ele deve ser aberto de forma apropriada, usando a opção w. • Usamos a função fprintf(). int fprintf(ponteiro para arquivo, texto, variáveis); quarta-feira, 13 de março de 2013 Escrevendo dados em um arquivo texto quarta-feira, 13 de março de 2013 Exercício • Faça um programa que: • Receba do usuário o nome de dois arquivos, um de entrada e outro de saida; • Realize a cópia do arquivo de entrada para o arquivo de saida. quarta-feira, 13 de março de 2013 \ • \ quarta-feira, 13 de março de 2013 Função fopen • FILE* fopen(const char *caminho, char *modo); quarta-feira, 13 de março de 2013 Função fopen • Se umarquivo for aberto para leitura (r) e ele não existir, fopen retorna NULL. • Se um arquivo for aberto para escrita ou escrita/leitura (w/w+) e existir ele é sobrescrito. • Se o arquivo não existir, ele é criado. • Se um arquivo for aberto para leitura/escrita (r+) e existir, ele não será apagado. quarta-feira, 13 de março de 2013 Lendo um texto na memória • Podemos ler todo o texto de um arquivo para um vetor e fazer as alterações que precisamos. • O texto alterado pode então ser sobrescrito sobre o texto anterior • Como exemplo vamos fazer um programa que troca toda a ocorrencia de ‘a’ por ‘A’ quarta-feira, 13 de março de 2013 quarta-feira, 13 de março de 2013 quarta-feira, 13 de março de 2013 Resumo para se trabalhar com arquivo • Crie um ponteiro para o arquivo: FILE *parq; • Abra o arquivo de modo apropriado associando-o a um ponteiro: • parq = fopen(“nomeArquivo”, “modo”); • Leia dados do arquivo na memória usando fscanf • fscanf(parq, string-tipo-variavel, &variavel); • Dados podem ser lidos até EOF. • Altere dados se necessário e escreva-o novamente em arquivo • fprintf(parq, string-tipo-variavel, variavel); • Todo arquivo deve ser fechado • fclose(parq); quarta-feira, 13 de março de 2013 Outras informações • fscanf pode ler variáveis de outros tipos que não texto ou char • fscanf(parq, “%d”, &i); • O mesmo é válido para fprintf • fprintf(parq, “%d”, i); • Pode-se remover um arquivo usando a função remove(nomeArquivo) quarta-feira, 13 de março de 2013 Exercícios • (1) Faça um programa que conte o número de caracteres de um arquivo texto e imprima o resultado na tela. • (2) Escreva um programa que compare dois arquivos especificados pelo usuário e imprima sempre que os caracteres dos dois coincidirem. quarta-feira, 13 de março de 2013 Exercícios • (3) Faça um programa que solicite o nome de um arquivo e conte quantas palavras existem nesse arquivo, informando o usuário (outra parte do comando wc). Considere que uma palavra é separada de outra por pelo menos um espaço em branco ou um final de linha. quarta-feira, 13 de março de 2013 Arquivos Binários • Vimos que existem dois tipos de arquivos: texto e binário; • Variáveis int ou float têm tamanho fixo na memória, por exemplo um int ocupa 4 bytes. • Representação em texto precisa de um número variável de dígitos (10, 5.634, 100.300) • Lembre que cada caracteré um char e usa 1 byte de memória. quarta-feira, 13 de março de 2013 Arquivos Binários • Armazenar dados em arquivos de forma análoga a utilizada em memória permite: • Reduzir o tamanho do arquivo; • Guardar estruturas complicadas tendo acesso simples. quarta-feira, 13 de março de 2013 Arquivos Binários • Assim como em arquivos texto, devemos criar um ponteiro para arquivos. • Podemos então associa-lo com um arquivo através do comando fopen. FILE *arq; arq = fopen(“arquivo.bin”, “rb”); quarta-feira, 13 de março de 2013 Arquivos Binários • As funções fread e fwrite permitem, respectivamente, a leitura e escrita de blocos de dados; • Devemos determinar o número de elementos a serem lidos ou gravados e o tamanho de cada um. quarta-feira, 13 de março de 2013 Arquivos Binários • Para escrever um arquivo binário usamos a função fwrite. • pt-mem: Ponteiro para região de memória contendo os dados a serem gravados. • size: Número de bytes de um item. • num-items: Número de itens que devem ser gravados. • pt-arq: Ponteiro para o arquivo quarta-feira, 13 de março de 2013 Arquivos Binários • Podemos gravar double em binário do seguinte modo: quarta-feira, 13 de março de 2013 • Podemos gravar um vetor de double em binário da seguinte forma: Arquivos Binários quarta-feira, 13 de março de 2013 Arquivos Binários • Para ler um arquivo binário usamos a função fread. • pt-mem: Ponteiro para região de memória (já alocada) para onde os dados serão lidos. • size: Número de bytes de um item a ser lido. • num-items: Número de itens que deve ser lido. • pt-arq: Ponteiro para o arquivo. quarta-feira, 13 de março de 2013 • Usando o exemplo anterior podemos ler um double em formato binário Arquivos Binários quarta-feira, 13 de março de 2013
Compartilhar