Baixe o app para aproveitar ainda mais
Prévia do material em texto
ArquivoArquivoArquivoArquivo Conjunto de DADOS armazenados em memória secundáriasecundária Binário ( d )Arquivos em C (estruturado) T t[tratados como streams] Texto (caracteres) [tratados como streams] 1 Arquivo Texto Arquivo Texto vsvs BinárioBinário ARQUIVO TEXTO • dados: caracteres (1 byte (8 bits) cada)( y ( ) ) • organizado em linhas, de tamanho variável ARQUIVO BINÁRIOARQUIVO BINÁRIO • dados: estruturados e dados simples (cada elemento pode conter mais de 1 byte) i d bl b t• organizado em blocos, em bytes... COMPARAÇÃO:COMPARAÇÃO pegando-se um número inteiro (de 32 bits), com 88 dígitos... No arquivo texto terá: sizeof(char)*88 = 64 bitssizeof(char) 88 = 64 bits No arquivo binário terá: sizeof(int) = 32 bits { do mesmo jeito que está na memória! } 2 está na memória! } Arquivos: comparação texto e binárioArquivos: comparação texto e binário Texto: Facilidade para a criação Binário: O processamento é mais rápido - Facilidade para a criação, visualização de conteúdo e de edição de arquivos texto, com qualquer editor de textos - O processamento é mais rápido, pois os dados não precisam de qualquer conversão. qualquer editor de textos. - O processamento é lento porque os dados, ao serem gravados, devem ser convertidos para a - Consomem menos espaço em bytes, o que os tornam mais adequados para grandes volumes devem ser convertidos para a representação de caracteres em ASCII. C b i á da dados. - Conteúdo não pode ser entendido sem a “máscara” - Consomem bem mais área para armazenamento - Caracteres numéricos precisam entendido sem a máscara correspondente (como a structure utilizada). S d lid l ser convertidos para permitir operações - So podem ser lidos pelo programa que o criou. Arquivo TextoArquivo Texto • elemento/posição corrente: - linha caractere- caractere • marcador de final de linha: - uso pela linguagem C: “\n”uso pela linguagem C: \n - em Unix, Linux, AIX, Xenix, Mac OS X, BeOS, ...: LF (line feed) - em Commodore, Apple II e até Mac OS 9: CR (carriage return) em DOS OS/2 Microsoft Windows: CR+LF- em DOS, OS/2, Microsoft Windows: CR+LF Obs.: o sistema operacional converte o \n para seu padrão de fim de linha! • marcador de final de arquivo: - caractere EOF arqu.txt ⌫⌫ESTE EH UM TEXTO EXEMPLO EBLABLABLA⌫⌫ ⌫⌫ ⌫⌫ ESTE EH UM TEXTO EXEMPLO EBLABLABLA 4 ⌫⌫⌫⌫ EOF FINAL DE LINHA Arquivo Texto: marca de fim de linhaArquivo Texto: marca de fim de linha As marcas de fim de linha tem que ser colocadas explicitamente pelo programa. A marca de fim de arquivo é gerada pelo sistema quando o arquivoA marca de fim de arquivo é gerada pelo sistema, quando o arquivo que foi aberto com opção de escrita é fechado (embora possa ser inserida pelo programa). A marca de final de linha em Linguagem C é o caractere ‘\n’, mas conforme o sistema operacional sua representação pode mudar: - em Unix, Linux, AIX, Xenix, Mac OS X, BeOS, ...: LF (line feed)( ) - em Commodore, Apple II e até Mac OS 9: CR (carriage return) = em DOS OS/2 Microsoft Windows: em DOS, OS/2, Microsoft Windows: CR+LF Ou seja cada sistema operacional converte o \nOu seja, cada sistema operacional converte o \n para o seu marcador específico de fim de linha! Leitura e/ou gravação de arquivos texto:Leitura e/ou gravação de arquivos texto: A leitura ou gravação em um arquivo texto pode ser feita: Leitura e/ou gravação de arquivos texto:Leitura e/ou gravação de arquivos texto: A leitura ou gravação em um arquivo texto pode ser feita: - linha a linha ou - caractere a caracterecaractere a caractere. Uma linha em um arquivo texto é o conjunto dos caracteresUma linha em um arquivo texto é o conjunto dos caracteres que se encontram no arquivo entre: - o início do arquivo e a primeira marca de fim de linha, ouo início do arquivo e a primeira marca de fim de linha, ou o início do arquivo e a marca de fim de arquivo (no caso de arquivos com uma só linha) ou - duas marcas de fim de linha. Comandos de manipulaçãoComandos de manipulação fopen (<nome do arquivo>,<modo de abertura>) Nome do arquivo em disco “r” – abre um arquivo texto para leitura “w” – cria/recria um arquivo texto para escrita “a” – acrescenta ao fim de um arquivo texto existente Modo de abertura “r+” – abre um arquivo texto para leitura/escrita “w+” – cria/recria um arquivo texto para leitura/escrita “a+” – acrescenta em/cria um arquivo texto para leitura/escrita Abre/cria/recria um arquivo com o nome e modo passados. Obs.: a função retorna um apontador para uma estrutura FILE!Obs.: a função retorna um apontador para uma estrutura FILE! para leitura/escrita Ex:Ex: #include <stdio.h> /* contém definições e funções p/ uso e manipulação de streams */ #include <stdlib.h> void main(){ FILE *arq; /* declaração da estrutura */ arq = fopen(“exemplo.txt”,”r”); /*abertura para leitura */q p ( p , ); / p / if (!arq) /* retorno NULL indica erro na abertura */ printf(“Erro na abertura do arquivo.”); } 7 Modos de abertura para arquivos textoModos de abertura para arquivos texto Modo de abertura Arquivo Existe Arquivo não existe Permissão de leitura Permissão de escrita r ok erro x cria novo, antigo iw eliminado cria x r+ ok erro x x cria novo antigo w+ cria novo, antigo eliminado cria x x novos dados a acrescentados ao final cria x novos dados a+ acrescentados ao final cria x x Abertura de arquivo texto Abertura de arquivo texto #include <stdio h> /* contém definições e funções Exemplo:Exemplo: Retorna um apontador para uma estrutura FILE. #include <stdio.h> / contém definições e funções p/ uso e manipulação de streams */ #include <stdlib.h> FILE *arq; int main( ) {{ arq = fopen(“c:\\exemplo.txt”,”r”); /*abertura para leitura */ if (arq == NULL) /* retorno NULL indica erro na abertura */ printf(“Erro na abertura do arquivo.”); ..... } 9} Internamente ao programa, nomes de arquivos que incluam \ devem ser escritos com duas \\ fclose (<apontador para FILE>) F h d iFecha um stream de arquivo Obs.: ao fechar o stream do arquivo todos os dados que ainda estavam em buffer serão salvos em discoque ainda estavam em buffer serão salvos em disco. fflush (<apontador para FILE>) Descarrega o conteúdo em buffer para o arquivo sem fechar o stream putc (<caractere>,<FILE *>) Escreve um caractere no arquivoEscreve um caractere no arquivo getc (<FILE *>)getc (<FILE *>) Retorna um caracter lido do arquivo 10 fgets (<&strbuffer>,<tamanho>,<FILE*>) Lê i /li h d iLê uma string/linha de um arquivo Obs.: a função inclui um “\0” ao fim da string, logo a função lê até tamanho-1 ou até um caractere logo a função lê até tamanho-1 ou até um caractere de nova linha (\n) ser lido, adicionando-o à string. fputs (<&strbuffer>,<FILE*>)fputs (<&strbuffer>,<FILE >) Escreve uma string/linha num arquivo fprintf (<FILE *>,<“txtE%cods”>,<var1,var2,...>) Escreve caracteres em um arquivoEscreve caracteres em um arquivo *similar a printf() fscanf (<FILE *> <“%cods”> <&var1 &var2 >)fscanf (<FILE *>,< %cods >,<&var1,&var2,...>) Lê caracteres de um arquivo * i il f() 11 *similar a scanf() ExemploExemplo fgets() e fputs()fgets() e fputs()pp g () p ()g () p () #include <stdio.h> /*Este programa faz uma cópia do conteúdo do 1º para o 2º arquivo/ Este programa faz uma cópia do conteúdo do 1 para o 2 arquivo, os quais são passados como parâmentro*/ int main(int argc, char **argv) //arqv é um vetor com nomes dos arquivos {{ FILE *entrada, *saida; char string[256]; if ((entrada = fopen(argv[1], "r")) == NULL) printf("Erro ao abrir %s\n", argv[1]); Mostrar exemplo de parâmetros por linha d d d d p (\ , g [ ]); else if ((saida=fopen(argv[2], "w")) == NULL) { printf("Erro ao abrir %s\n", argv[2]); fclose(entrada); de comando rodando. } else { while (fgets(string, sizeof(string), entrada)) //*copia uma linha ou 255 (256-1) caracteres e fecha “string” com o caractere nulo (“\0”)*/ fputs(string, saida); /*escreve no arq. de saída*/ fclose(entrada); f l ( id )fclose(saida); } } 12 ExemploExemplo fprintf()fprintf()ExemploExemplo fprintf()fprintf() ... /*Cadastra clientes e seus telefones em um arquivo texto./ Cadastra clientes e seus telefones em um arquivo texto. Obtém os dados pelo teclado*/ ... FILE *arq; char nome[80];char nome[80]; int prefixo, num; arq = fopen(“arquivo.txt”,“a”); ... scanf (“%s%d%d”, nome, &prefixo, &num); /*lê dados do teclado...*/ fprintf (arq, “%s %d %d”, nome, prefixo, num);fprintf (arq, %s %d %d , nome, prefixo, num); /*...os escreve no arquivo*/ ... ... 13 Exemplo fscanf()Exemplo fscanf()Exemplo fscanf()Exemplo fscanf() ... /*Consulta clientes de acordo com a estrutura do arquivo/ Consulta clientes de acordo com a estrutura do arquivo texto do exemplo anterior*/ ... FILE *arq; char nome[80] nome2[80];char nome[80], nome2[80]; int prefixo, num; arq = fopen(“arquivo.txt”,“r”); ... printf (“Nome? ”); gets (nome); while (!feof(fp)){while (!feof(fp)){ fscanf (arq, “%s%d%d”, nome2, &prefixo, &num); if (!strcmp(nome, nome2)){ ... }} } ... ... 14 Funções sobre arquivosFunções sobre arquivos feof (<FILE *>) Indica se um arquivo chegou ao fimq g Retorna verdadeiro (não-zero) caso o final foi atingido, falso (zero) caso contrário. ferror(<FILE *>) Indica se a última operação com um arquivo produziu um erroIndica se a última operação com um arquivo produziu um erro Cada nova operação com o arquivo modifica a condição de erro. ... FILE *arq; ... ... FILE *arq; char c; while(!feof(arq)){ /* Enquanto não for o fim faça... */ ... } ; arq = fopen(...,“r”); ... c = getc(arq); if(ferror(arq)) 15 } ... ... if(ferror(arq)) printf(“Erro na Leitura!”); ... ... rewind(<FILE *>)rewind(<FILE >) Seta a posição corrente do arquivo para o início fseek(<FILE *>,<numbytesdesloc>,<origem>) Move a posição corrente de leitura/escrita para a posição calculada como origem+numbytesdesloc Os valores possíveis definidos para origem são:Os valores possíveis, definidos, para origem são: SEEK_SET ou 0 = Início do arquivo SEEK_CUR ou 1 = Ponto corrente no arquivo SEEK END ou 2 = Fim do arquivoSEEK_END ou 2 = Fim do arquivo ... FILE *arq; struct Estrutura buffer; ... FILE *arq; arq = fopen( ); arq = fopen(...); fseek(arq,1*sizeof(char),SEEK_SET); /*seta a posição para o início do 2º caractere do arquivo*/ h t ( ) arq = fopen(...); ... rewind(arq); /*posição corrente = início*/ 16 char c = getc(arq); ... ... ... ... rename(<NomeAntigo>,<NovoNome>) Renomeia um arquivo ou o Move para um diretório destinoq p Obs.: o arquivo deve estar fechado! remove(<NomeDoArquivo>) Apaga o arquivo especificado do discoApaga o arquivo especificado do disco Obs.: o arquivo deve estar fechado! ... ... remove(“tourstart.exe”); ... ... rename(“a.dat”,“b.dat”); ( ); /*remove o arquivo especificado*/ ... ... ( , ); /* a.dat -> b.dat */ ... ... 17 Exercícios com arquivos textoExercícios com arquivos texto 1. Considerar um arquivo texto já existente. Faça um procedimento que copie este para outro conservando oprocedimento que copie este para outro, conservando o mesmo conteúdo do primeiro 2. Faça outro para incluir uma nova linha no final de um arquivo 3. Faça agora um para substituir um caractere por outro (parâmetros: nome do arquivo caractere que será(parâmetros: nome do arquivo, caractere que será substituído e caractere substituto) 18 1. Copia do conteúdo de um arquivo para outro /*Gera uma copia de um arquivo texto*/ #include <stdio h>#include <stdio.h> #include <stdlib.h> #define MAXLINHA 255 int main( ) {{ FILE *arq1; FILE *arq2; int cont = 0; char linha[MAXLINHA];char linha[MAXLINHA]; system("color F1"); if ((arq1 = fopen("texto_input.txt", "r")) == NULL) printf("Erro ao abrir arquivo entrada \n"); else if ((arq2 = fopen("texto_output.txt", "w")) == NULL) printf("Erro ao abrir arquivo saida \n"); else { while (!feof(arq1)) if (fgets(linha, sizeof(linha), arq1) != NULL ) { // leu linha cont++ ; f t (li h 2) // li hfputs (linha, arq2); // grava linha } printf("\nLinhas gravadas: %d\n", cont);// informa nro de linhas gravadas fclose (arq1); f l s ( 2); 19 fclose(arq2); } ..... } 2. Inserir nova linha no fim de um arquivo #include <stdio.h># int insereLinhaFinal(){ FILE *arq;q; char nome[30]; printf(“Nome do arquivo: ”); scanf(“%s”,nome); if ((arq = fopen(nome, "a")) == NULL){ /*abre para acrescentar*/ printf("Erro ao abrir %s\n", nome); exit(1); } ( \ ) / /putc(‘\n’,arq); /*acrescenta nova linha*/ fclose(arq); } 20 3. Substituiu um caractere por outro #include <stdio.h># int main(int argc, char **argv){ /*Lembrando.. argv é um ponteiro pra ponteiro!*/ /* uso: programa.exe <arquivotexto> <caractere> <substituto> *// uso: programa.exe <arquivotexto> <caractere> <substituto> / FILE *arq; char lugar; if ((arq = fopen(argv[1] "r+")) == NULL){if ((arq = fopen(argv[1], r+ )) == NULL){ /*abre para acrescentar*/ printf("Erro ao abrir %s\n", argv[1]); exit(1); }} lugar = *(argv[2]); /*caractere que será substituído*/ printf("\n%c\n",*(argv[2])); printf("\n%c\n",lugar); while (!feof(arq)){while (!feof(arq)){ char temp = getc(arq); if(temp == lugar){ fseek(arq,-1*sizeof(char),SEEK_CUR); /*volta a i ã d t d */posição do caractere procurado*/ putc(*(argv[3]),arq); /*substitui*/ fflush(arq); /*escreve mudanças*/ } } 21 } fclose(arq); } ExercíciosExercícios A partir de um arquivo binário, já gravado, com estruturas quep q , j g , q contém informações sobre atletas (ver aulas anteriores): Nome (string) Id d (i t)Idade (int) Altura (float) 1 Gerar um arquivo texto onde cada linha apresenta o número1. Gerar um arquivo texto onde cada linha apresenta o número de ordem sequencial do atleta correspondente a cada estrutura, seguido do contéudo dos campos com pontuação, g p p ç conforme o exemplo: Atleta 1: João Silva – 25 anos – 1.87m 22 ExercíciosExercícios 2. Outro programa que: - remove um atleta dos 2 arquivos inclui mais um atleta no final do arquivo binário e texto- inclui mais um atleta no final do arquivo binário e texto - altera algum campo do arquivo binário e atualiza o arquivo texto correspondente.p . 23 fclose (<apontador para FILE>) fopen (<nome do arquivo>,<modo de abertura>) “r” – abre um arquivo texto para leiturafclose (<apontador para FILE>) fflush (<apontador para FILE>) “w” – cria/recria um arquivo texto para escrita “a” – acrescenta ao fim de um arquivo texto existente “r+” – abre um arquivo texto para leitura/escrita putc (<caractere>,<FILE *>) getc (<FILE *>) “w+” – cria/recria um arquivo texto para leitura/escrita “a+” – acrescenta em/cria um arquivo texto para leitura/escrita fgets (<&strbuffer>,<tamanho>,<FILE*>) fputs (<&strbuffer>,<FILE*>)fputs (<&strbuffer>,<FILE >) fprintf (<FILE *>,<“txtE%cods”>,<var1,var2,...>) f f ( d 1 2 )fscanf (<FILE *>,<“%cods”>,<&var1,&var2,...>) rename(<NomeAntigo>,<NovoNome>) remove(<NomeDoArquivo>) 24 ExercíciosExercícios 3 Faça uma função que :3. Faça uma função que : - receba um nome de arquivo e uma matriz de char 80x25 - leia o arquivo atribuindo um caractere a cada posição daq p ç matriz, mantendo a topologia do texto original - caso o arquivo não ocupe a matriz toda, as posições vazias d ã b 0 ( t ‘\0’)deverão receber0 (caractere ‘\0’) este programa B e s t e p r o g r ama B 0 t em uma ma t r i z B 0tem uma matrizB linha 3 B ultima linha B t em uma ma t r i z B 0 l i n h a 3 B 0 u l t i m a l i n h a B 0 B 0 ... 4 F t f ã B BBBBBBBBBBBBBBB B 0 B B B B B B B B B B B B B B B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4. Faça uma outra função que: – receba a matriz do exercício anterior – limpe a tela e exiba a matriz trocando todas as letras B pelo ... 25 limpe a tela e exiba a matriz trocando todas as letras B pelo caractere bloco: ‘█’ (código ascii extendido=219).
Compartilhar