Operações com Arquivos
Monitoria 2012.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;

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
 O nome do arquivo deve conter também a suta extensão.

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.
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
Modo texto x Modo binário
Casos
Modo texto
Modo Binário
Interpretação do
caractere '\n'
'\n' (1 byte)
CR/LF (2 bytes)
Interpretação do
Caractere
'\x1A'(Ctrl + Z)
Sai do programa
É um caractere
qualquer
Interpretação dos
Números
Cada dígito é
interpretado como um
caractere(char)
Um número é
interpretado
como um
número(int, float...)
Leitura e gravação em alto nível

Caractere a caractere
 getc e putc

Linha a linha
 fgets e fputs

Forma formatada
 fscanf e fprintf

Bloco de dados
 fread e fwrite
Caractere a caractere

int getc(FILE *fp);
 Lê um caractere de fp
 Retorna EOF se houver erro
 Exemplo:
○ getc(fp);

int putc(int c, FILE *fp);
 Escreve um caractere em fp
 Retorna EOF se houver erro
 Exemplo:
○ putc(‘A’, fp);
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);
Forma formatada

int fscanf(FILE *pf, char *str, ...);
 Similar a scanf() porém lê de um arquivo
 Exemplo:
○ fscanf(fp, “%d %c”, &num, &ch);

int fprintf(FILE *pf, char *str, ...);
 Similar a printf() porém escreve em um arquivo
 Exemplo:
○ fprintf(fp, “%d %c”, num, ch);
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);
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);
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);
}
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
rewind e remove

void rewind(FILE *fp);
 Move o cursor para o inicio do arquivo
 Exemplo:
○ rewind(fp);

int remove(char *Arquivo);
 Apaga o arquivo que passamos o ponteiro.
 Retorna zero se ocorreu sucesso
 Não zero em caso de erro
 Exemplo:
○ remove(“Arquivo.txt”);
Verificando fim de arquivo

int feof(FILE *fp);
 Indica o fim de um arquivo
 Retorna 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.
Exercícios
1) Escreva um programa que leia um arquivo e imprime no final desse
mesmo arquivo, sem sobrescreve-lo, qual é o caractere que mais se
repete. O nome do arquivo a ser lido deve ser dado pelo usuario.
2)Faça um programa que lê de um arquivo, o sexo, o primeiro nome, e a idade de
uma lista de pessoas. 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
Download

FILE *fp