Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

18
Aula Prática 11 Operações com Arquivos Monitoria 2010.2

Transcript of Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Page 1: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Aula Prática 11

Operações com Arquivos

Monitoria 2010.2

Page 2: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

A estrutura FILE

É como um tipo de dado, mas não é um tipo propriamente dito

Definido no arquivo cabeçalho stdio.h da biblioteca

Declarar um ponteiro de arquivo Exemplo:

FILE *fp;

Page 3: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Abrindo e Fechando Arquivos

FILE *fopen(char *nomeDoArquivo, char *modo); Abre um arquivo e retorna um ponteiro para ele Se algum erro ocorrer a constante NULL é retornada Exemplo:

○ fp = fopen(“Arquivo.txt”, “r”); É de fundamental importância verificar se o arquivo foi aberto

corretamente.

int fclose(FILE *fp); Fecha o arquivo passado como parâmetro Retorna 0 se o arquivo foi fechado corretamente Retorna a constante EOF se algum erro ocorreu Exemplo:

○ fclose(fp); É muito importante fechar todos os arquivos que o seu programa abriu, isto

evita a perda dos dados armazenados no buffer. Fechar um arquivo faz com que qualquer caractere que tenha permanecido

no "buffer" associado ao fluxo de saída seja gravado.

Page 4: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Exit

Aborta a execução do programa. Protótipo:

void exit (int codigo_de_retorno);

Contida no arquivo de cabeçalho stdlib.h. Importante para erros com arquivos e alocação

dinâmica. Exemplo:

if(!fp)

exit(1);

Page 5: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Modo Significado

"r" Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto.

"w"Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído.

"a"

Abrir um arquivo texto para gravação. Os dados serão adicionados no fim do arquivo ("append"), se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente.

"rb"Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário.

"wb"Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário.

"ab"Acrescenta dados binários no fim do arquivo, como no modo "a" anterior, só que o arquivo é binário.

"r+"Abre um arquivo texto para leitura e gravação. O arquivo deve existir e pode ser modificado.

"w+"Cria um arquivo texto para leitura e gravação. Se o arquivo existir, o conteúdo anterior será destruído. Se não existir, será criado.

"a+"

Abre um arquivo texto para gravação e leitura. Os dados serão adicionados no fim do arquivo se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente.

"r+b"Abre um arquivo binário para leitura e escrita. O mesmo que "r+" acima, só que o arquivo é binário.

"w+b"Cria um arquivo binário para leitura e escrita. O mesmo que "w+" acima, só que o arquivo é binário.

"a+b"Acrescenta dados ou cria uma arquivo binário para leitura e escrita. O mesmo que "a+" acima, só que o arquivo é binário

Page 6: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Modo texto x Modo binário

Casos Modo texto Modo Binário

Interpretação docaractere '\n'

'\n' (1 byte) CR/LF (2 bytes)

Interpretação doCaractere

'\x1A'(Ctrl + Z)Sai do programa

É um caracterequalquer

Interpretação dosNúmeros

Cada dígito éinterpretado como um

caractere(char)

Um número éinterpretado

como umnúmero(int, float...)

Page 7: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Leitura e gravação em alto nível

Caractere a caracteregetc e putc

Linha a linhafgets e fputs

Forma formatadafscanf e fprintf

Bloco de dadosfread e fwrite

Page 8: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Caractere a caractere int getc(FILE *fp);

Lê um caractere de fpRetorna EOF se houver erroExemplo:

○ getc(fp);

int putc(int c, FILE *fp);Escreve um caractere em fpRetorna EOF se houver erroExemplo:

○ putc(‘A’, fp);

Page 9: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Linha a linha char *fgets(char *str, int tamanho, FILE *fp);

Lê no máximo tamanho caracteres de fp e guarda em str

Se a função encontrar ‘\n’ ou EOF ela para Exemplo:

○ fgets(string, 80, fp);

char *fputs(char *str, FILE *fp); Imprime uma string no arquivo Exemplo:

○ fputs(string, fp);

Page 10: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Forma formatada

int fscanf(FILE *pf, char *str, ...);Similar a scanf() porém lê de um arquivoExemplo:

○ fscanf(fp, “%d %c”, &num, &ch);

int fprintf(FILE *pf, char *str, ...);Similar a printf() porém escreve em um arquivoExemplo:

○ fprintf(fp, “%d %c”, num, ch);

Page 11: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

fread int fread(void *buffer, int numBytes, int qtd, FILE *pf);

buffer é o local onde os dados lidos do arquivo serão guardados

numBytes é o tamanho da unidade a ser lida qtd é o número máximo de unidades a serem lidas pf é o arquivo do qual se deseja ler O retorno é o número de unidades efetivamente lidas Exemplo:

FILE *pf = fopen(“meuArquivo”, “r”);int mat[12];fread(mat, sizeof(int), 10, pf);

Page 12: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

fwrite int fwrite(void *buffer, int numBytes, int qtd, FILE *pf);

buffer é o local que contém os dados a serem gravados numBytes é o tamanho da unidade a ser gravada qtd é o número de unidades a serem gravadas pf é o arquivos do no qual se deseja gravar os dados O retorno é o número de unidades efetivamente gravadas Exemplo:

FILE *pf = fopen(“meuArquivo”, “w”);int mat[] = { 1, 2, 3, 4 };fwrite(mat, sizeof(int), 4, pf);

Page 13: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

ferror e perror int ferror(FILE *fp);

Retorna zero se não houver erros na última operação realizada com um arquivo

Caso contrário retorna não-zero

perror (char *mensagem) é usada em conjunto com ferror, e indica em que parte

do programa ocorreu um erro. Recebe como argumento uma string.

Exemplo:○ if(ferror(fp))

{perror("Erro na gravacao");exit(1);

}

Page 14: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

fseek int fseek(FILE *pf, long numBytes, int origem);

Move a posição corrente de leitura ou escrita em um arquivo

pf é o arquivo que se deseja percorrer numBytes é o número de bytes a serem movidos retorna 0 em caso de sucesso ou não-zero caso contrário. origem é o ponto de partida(geralmente usa-se as

macros abaixo):

Nome Val Significado

SEEK_SET 0 Inicio do arq.

SEEK_CUR 1 Ponto corrente

SEEK_END 2 Fim do arquivo

Page 15: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

rewind e remove void rewind(FILE *fp);

Move o cursor para o inicio do arquivoExemplo:

○ rewind(fp);

int remove(char *Arquivo);Apaga o arquivo que passamos o ponteiro.Retorna zero se ocorreu sucessoNão zero em caso de erroExemplo:

○ remove(“Arquivo.txt”);

Page 16: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Verificando fim de arquivo

int feof(FILE *fp);Indica o fim de um arquivoRetorna não-zero se o arquivo chegou ao

fim e zero caso contrário

Outra maneira de verificar o término do arquivo é comparar um caractere lido com EOF.

Page 17: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

Exercícios 1. Escreva um programa que leia um programa-fonte em C e verifique

se o número de chaves abertas e fechadas é igual. Peça ao usuário que digite o nome do arquivo. (ex: para ler o arquivo “main.c”, o usuário deve digitar apenas “main”)

2. Escreva um programa que imprima um arquivo na tela de 20 em 20 linhas. O arquivo de entrada deve ser fornecido pelo usuário. A cada impressão de 20 linhas, o programa aguarda o pressionamento de uma tecla.

3. Faça um programa que lê de um arquivo, o sexo, o primeiro nome, e a idade de uma lista de pessoas. E imprima em outro arquivo, o número de homens, o número de mulheres e a idade da pessoa mais velha. A primeira linha do arquivo de entrada deve conter o número de pessoas. Ex:

Entrada.txt

3 M Joao 40 F Maria 32 M Carlos 27

Saída.txt O numero de homens: 2 O numero de mulheres: 1 A idade da pessoa mais velha e: 40

Page 18: Aula Prática 11 Operações com Arquivos Monitoria 2010.2.

4)Existe um campo de criação minhocas.O fazendeiro resolveu criar uma máquina que pudesse colher as minhocas de forma mais eficiente. Seu trabalho é calcular qual a melhor linha ou coluna que permita colher a maior quantidade de minhocas. Sabe-se que a máquina só percorre em o campo em linha reta, não faz curva. Cada número representa a produtividade na cédula.

Restrições:

No arquivo de entrada “fazenda.txt” estarão os seguintes dados sobre o campo.

A resposta deve ser impressa no arquivo ”produtividade.txt”

Lembrando que não necessariamente terá apenas uma fazenda no arquivo de entrada.

Entrada:

3 3

8 15 81

77 53 33

210 40 10

Saida:

Conjunto #n /*n varia de acordo com a quantidade de fazendas no arquivo.*/

A linha/coluna de maior quantidade de minhocas tem: <quantidade>

<cursor aqui.>

8 15 81

77 53 33

210 40 105

Exercícios