Manipulação de Arquivos em C
description
Transcript of Manipulação de Arquivos em C
Manipulação de Arquivos em C
ArquivosTipos de arquivo:
– Sequencial (texto)• Caracteres armazenadas
sequencialmente. • É possível determinar o
primeiro, segundo terceiro .. caracteres que compõem o arquivo
– Binário• Formado por uma seqüência
de bytes sem correspondência com um tipo de dado.
• Cabe ao programador fazer esta correspondência quando le e escreve estes arquivos.
Descritor de Arquivos• Descritor de arquivo:
– Em C: Estrutura de dados denominada FILE
– Armazena informações sobre o arquivo em memória secundária (arquivo físico).
– O arquivo lógico e armazenado em variáveis de memória definidas pelo programador.
– Criando um descritor:FILE *parquivo;
Arquivo “lógico”em memória
Descritor de Arquivo (FILE)Arquivo
“Físico”
Memória secundária
Memória primária
Abrindo e Fechando Arquivos
• Abrir um arquivo: função fopen(..)– Associar um descritor a um arquivo físico: FILE *parquivo;char *nome = "texto.txt";if (( parquivo = fopen(nome, "w+b")) == NULL) {
printf("\n\nNao foi possivel abrir o arquivo para escrita.\n");
exit(1); }
Abrindo e Fechando ArquivosFILE *pa Fopen (nome_do_arquivo_físico,
modo_de_abertura)• Modos de abertura:
r Abre um arquivo texto para leitura
w Cria um arquivo texto para escrita
a Adiciona texto ao fim de um arquivo texto
rb Abre um arquivo binário para leitura
wb Abre um arquivo binário para escrita
ab Anexa a um arquivo binário
[r+, w+, a+ ]+ b O + inclui escrita ou leitura nos modos e o + b define como binário
Abrindo e Fechando Arquivos
• Fechando um arquivo: função fclose(..)– Quando um programa não precisa mais utilizar um
arquivo por um período de tempo longo, o arquivo pode ser fechado
– Fechar um arquivo protege os seus dados, garante que atualizações feitas serão salvas e libera o arquivo para outros usuários ou programas poderem utiliza-lo.
fclose(parquivo);
Lendo dados em um arquivo sequencial
• Quando o arquivo é aberto, a posição corrente (mantida internamente pelo sistema) é o início do arquivo.
• A cada operação executada sobre o arquivo, essa posição é atualizada.• A função int ftell(FILE *pa)retorna a posição corrente no arquivo• A função feof retorna um valor verdadeiro (inteiro diferente de 0) se a posição
corrente para o arquivo indicado é o final do arquivo, ou falso (inteiro igual a 0) em caso contrário.
• A rotina C para obter um caráter de um arquivo é fgetc: – int fgetc(FILE *stream); – O valor de retorno de fgetc é um inteiro, que pode conter o
código ASCII do caráter ou o valor EOF (definido em stdio.h), que indica o final do arquivo ou a ocorrência de alguma condição de erro.
• A função rewind() recoloca o indicador de posição de arquivo no inicio do arquivo.
Exemplovoid exemplo3 (){FILE *parquivo;char *nome = "texto.txt";char ch;if (( parquivo = fopen(nome, "r")) == NULL) { printf("\n\nNao foi possivel abrir o arquivo para escrita.\
n"); exit(1);} while (feof(parquivo)== FALSE) { ch = fgetc(parquivo); putchar(ch); }rewind(parquivo);}
fscanf e fprintf
• fprintf() e fscanf() são semelhantes a printf() e scanf().
Adiciona-se um parâmetro descritor de arquivo nestas funções para determinar o arquivo de onde se está lendo ou escrevendo.
fscanf// Lendo caracteres:void exemplo4() {FILE *parquivo;char *nome = "texto.txt";char ch;if (( parquivo = fopen(nome, "r")) == NULL) { printf("\n\nNao foi possivel abrir o arquivo para
escrita.\n"); exit(1);} while (feof(parquivo)== FALSE) { fscanf (parquivo, "%c", &ch); putchar(ch); }}
fscanf//Lendo números inteirosvoid exemplo5() {FILE *parquivo;char *nome = "numeros.txt";int n;if (( parquivo = fopen(nome, "r")) == NULL) { printf("\n\nNao foi possivel abrir o arquivo para
escrita.\n"); exit(1);} while (feof(parquivo)== FALSE) { fscanf (parquivo, "%d", &n); printf("%d ", n); }}
fprintfvoid exemplo6() {FILE *parquivo;int i=10;char *nome = "numeros.txt";int n;if (( parquivo = fopen(nome, "a+")) == NULL) { printf("\n\nNao foi possivel abrir o arquivo.\n"); exit(1);} while (i++<20) { fprintf(parquivo, "%d ", i); } rewind(parquivo);
while (feof(parquivo)== FALSE) { fscanf (parquivo, "%d", &n); printf("%d ", n); }}